Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Anagram jest słowem lub wyrażeniem, które powstaje w wyniku przestawienia liter lub sylab innego wyrazu lub innej frazy. Przykładami anagramów są: 'krab' = 'brak' = 'bark'.

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 ASCIIASCIItablicy ASCII.

  • narodowe znaki diakrytyczneznaki diakrytyczneznaki 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 ASCIIASCIItablicy ASCII,

  • narodowe znaki diakrytyczneznaki diakrytyczneznaki 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 'ż')