RLTzsHxpYrS7K
Zdjęcie przedstawia rozsypane płytki z literami alfabetu.

PY_I_R_W14_M17 Uwaga plagiat - porównujemy teksty.

Źródło: Wokandapix, domena publiczna.

Anagramy są wyrazami, wyrażeniami lub całymi zdaniami, które powstają wskutek przestawienia liter bądź sylab innych wyrazów lub zdań (z wykorzystaniem wszystkich liter wchodzących w skład tekstu oryginalnego). Przykładowymi anagramami są wyrazy „arbuz” i „burza”. Przestawiając litery w słowie „arbuz” ułożymy wyraz „burza” (nie dodając ani nie pomijając żadnego znaku).

Prostym sposobem sprawdzenia, czy dwa wyrazy są anagramami, jest próba ułożenia wszystkich liter składających się na jeden wyraz w taki sposób, aby otrzymać drugie słowo. Jeżeli próba zakończy się powodzeniem, uzyskujemy pewność, że sprawdzane wyrazy są anagramami.

Wykorzystując przedstawioną metodę sprawdź, czy w zapisanych niżej parach jeden wyraz jest anagramem drugiego:

  • wektor – wtorek

  • makrela – reklama

  • łoś – stolik

  • bryka – rybak

Trzy spośród czterech podanych par wyrazów są anagramami. Nie dotyczy to tylko wyrazów „łoś” i „stolik”. W przypadku tej właśnie pary od razu stwierdzimy, że jeden wyraz nie może być anagramem drugiego. Powód jest oczywisty: liczba liter w obu słowach jest różna. Nie ma znaczenia, w jaki sposób będziemy je przestawiać – na pewno nie uda nam się przekształcić jednego wyrazu w drugi.

Słowa będące anagramami zawierają taką samą liczbę identycznych liter. Wykorzystamy to spostrzeżenie podczas projektowania algorytmu pozwalającego sprawdzić, czy dwa wyrazy są anagramami.

Anagramami mogą być nie tylko pary wyrazów, ale także pary zdań. Muszą one spełniać te same warunki co słowa, jednak dwa zdania są anagramami nawet wtedy, gdy liczba składających się na nie wyrazów jest inna. Jest to istotne, ponieważ oznacza, że dwa ciągi znaków mogą zawierać różną liczbę spacji, a zarazem być anagramami.

Dla zainteresowanych

Więcej informacji o anagramach można znaleźć w serwisach poświęconych grze scrabble.

Przykład 1

W celu sprawdzenia czy różne ciągi znaków są anagramami możemy wykorzystać wbudowaną funkcję Pythona sorted(). Zwraca ona uporządkowaną rosnąco listę elementów obiektu (ciągu znaków), który został jej przekazany jako parametr.

Pamiętajmy o tym, jak działa funkcja sorted():

  • powtarzające się znaki są prezentowane jako kolejne elementy listy,

  • kolejność znaków odzwierciedla ich pozycję w tablicy ASCII.

  • narodowe znaki diakrytyczne są umieszczone za literami alfabetu łacińskiego.

  • może posiadać parametr reverse, który pozwala zwrócić listę posortowaną w kolejności malejącej, np. sorted("BED", reverse=True) -> "DEB",

Zapiszmy kod, który będzie sprawdzał, czy dwa ciągi znaków są anagramami:

Linia 1. def sprawdz podkreślnik anagram podkreślnik slow otwórz nawias okrągły slowo1 przecinek slowo2 zamknij nawias okrągły dwukropek. Linia 2. return sorted otwórz nawias okrągły slowo1 zamknij nawias okrągły znak równości znak równości sorted otwórz nawias okrągły slowo2 zamknij nawias okrągły. Linia 4. print otwórz nawias okrągły sprawdz podkreślnik anagram podkreślnik slow otwórz nawias okrągły apostrof bark apostrof przecinek apostrof krab apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 5. True. Linia 7. print otwórz nawias okrągły sprawdz podkreślnik anagram podkreślnik slow otwórz nawias okrągły apostrof bark apostrof przecinek apostrof krat apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 8. False.
Polecenie 1

Bazując na powyższym przykładzie i przykładach z lekcji o palindromach przygotuj taką modyfikację funkcji, aby wielkość znaków w sprawdzanych wyrażeniach nie miała znaczenia.

Przykład 2

Aby sprawdzić, czy zdania są anagramami, postępujemy podobne. Musimy jednak usunąć wszystkie znaki przestankowe (mogą one wpływać na wynik porównania ciągów).

Pamiętajmy o tym, jak działa funkcja sorted():

  • powtarzające się znaki są prezentowane jako kolejne elementy listy,

  • kolejność znaków odzwierciedla ich pozycję w tablicy ASCII,

  • narodowe znaki diakrytyczne są umieszczone za literami alfabetu łacińskiego.

  • może posiadać parametr reverse, który pozwala zwrócić listę posortowaną w kolejności malejącej, np. sorted("BED", reverse=True) -> "DEB",

Przygotujmy kod, który będzie sprawdzał, czy dwa zdania są anagramami:

Linia 1. def anagram podkreślnik re otwórz nawias okrągły tekst1 przecinek tekst2 zamknij nawias okrągły dwukropek. Linia 2. import re. Linia 4. kratka zamianiamy znaki przestankowe na cudzysłów cudzysłów otwórz nawias okrągły nic zamknij nawias okrągły. Linia 5. tekst1 znak równości re kropka subn otwórz nawias okrągły r cudzysłów otwórz nawias kwadratowy średnik przecinek dwukropek kropka wykrzyknik znak zapytania zamknij nawias kwadratowy cudzysłów przecinek cudzysłów cudzysłów przecinek tekst1 zamknij nawias okrągły. Linia 6. kratka przypisujemy pierwszy element z tupli minus zamknij nawias ostrokątny str. Linia 7. tekst1 znak równości tekst1 otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 8. kratka zamieniamy na małe litery cały napis. Linia 9. tekst1 znak równości tekst1 kropka lower otwórz nawias okrągły zamknij nawias okrągły. Linia 10. kratka wersja analogiczna jak powyżej przecinek ale w jednym poleceniu. Linia 11. tekst2 znak równości re kropka subn otwórz nawias okrągły r cudzysłów otwórz nawias kwadratowy średnik przecinek dwukropek kropka wykrzyknik znak zapytania zamknij nawias kwadratowy cudzysłów przecinek cudzysłów cudzysłów przecinek tekst2 zamknij nawias okrągły otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka lower otwórz nawias okrągły zamknij nawias okrągły. Linia 13. return sorted otwórz nawias okrągły tekst1 zamknij nawias okrągły znak równości znak równości sorted otwórz nawias okrągły tekst2 zamknij nawias okrągły.

Generowanie anagramów

Gdy chcemy utworzyć anagram dowolnego słowa, możemy posłużyć się prostym algorytmem:

  1. Słowo zamieniamy w listę znaków, nie korzystając jednak z funkcji sorted() – powinniśmy bowiem zachować kolejność liter.

  2. Z otrzymanej listy wybieramy losowo znak, który będzie kolejną (początkowo pierwszą) literą nowego słowa.

  3. Z listy znaków usuwany wybraną w punkcie 2. literę.

  4. Powtarzamy czynności opisane w punktach 2. i 3. dopóty, dopóki pozostają litery do wylosowania.

Przykład 3

Spróbujmy napisać program, który bazując na powyższym algorytmie utworzy anagram podanego słowa. Posłużymy się pętlą while.

Linia 1. def stworz podkreślnik anagram otwórz nawias okrągły slowo zamknij nawias okrągły dwukropek. Linia 2. from random import randint. Linia 3. lista znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 5. for litera in slowo dwukropek. Linia 6. lista kropka append otwórz nawias okrągły litera zamknij nawias okrągły. Linia 8. anagram znak równości apostrof apostrof. Linia 10. while lista dwukropek. Linia 11. losowana znak równości randint otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły lista zamknij nawias okrągły minus 1 zamknij nawias okrągły. Linia 12. nowa podkreślnik litera znak równości lista otwórz nawias kwadratowy losowana zamknij nawias kwadratowy. Linia 13. del otwórz nawias okrągły lista otwórz nawias kwadratowy losowana zamknij nawias kwadratowy zamknij nawias okrągły. Linia 14. anagram plus znak równości nowa podkreślnik litera. Linia 16. return anagram. Linia 18. kratka kilka przykładowych wywołań. Linia 19. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 20. apostrof karb apostrof. Linia 21. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 22. apostrof akbr apostrof. Linia 23. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 24. apostrof rkba apostrof. Linia 25. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 26. apostrof arbk apostrof. Linia 27. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 28. apostrof rbak apostrof. Linia 29. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 30. apostrof brak apostrof.
Dla zainteresowanych

Oto inny wariant funkcji generującej anagramy – pokazuje on, jak w Pythonie można zminimalizować ilość kodu:

Linia 1. def stworz podkreślnik anagram podkreślnik 2 otwórz nawias okrągły slowo zamknij nawias okrągły dwukropek. Linia 2. from random import randint. Linia 3. lista znak równości otwórz nawias kwadratowy litera for litera in slowo zamknij nawias kwadratowy. Linia 4. anagram znak równości apostrof apostrof. Linia 6. while lista dwukropek. Linia 7. anagram plus znak równości lista kropka pop otwórz nawias okrągły randint otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły lista zamknij nawias okrągły minus 1 zamknij nawias okrągły zamknij nawias okrągły. Linia 9. return anagram. Linia 11. kratka przykładowe wywołania. Linia 12. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 13. apostrof rkba apostrof. Linia 14. print otwórz nawias okrągły stworz podkreślnik anagram otwórz nawias okrągły apostrof bark apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 15. apostrof arbk apostrof.
Już wiesz

Podsumujmy najważniejsze elementy tej lekcji:

  • funkcja sorted() zwraca posortowano rosnąco listę elementów podanych jako pierwszy parametr,

  • funkcja sorted() może posiadać parametr reverse, który pozwala zwrócić listę posortowaną w kolejności malejącej, np. sorted("BED", reverse=True) -> "DEB",

  • metoda L.pop(x) dla elementu L typu list pobiera element o indeksie x i kasuje go z listy.

Słownik

ASCII
ASCII

(ang. American Standard Code for Information Interchange) pierwotnie siedmiobitowy system kodowania znaków (współcześnie rozszerzony do ośmiu bitów); w oryginalnej wersji kodom z zakresu 0–127 przyporządkowano 26 liter łacińskich, 10 cyfr (0...9) oraz dodatkowe znaki

znaki diakrytyczne
znaki diakrytyczne

wszystkie symbole (np. kropki, przecinki, dwukropki), które towarzyszą znakowi podstawowemu, zmieniając sposób odczytywania litery (w języku polskim są to np. kropki i kreski umieszczane nad literami 'ś' lub 'ż')