PY_I_R_W14_M17 Uwaga plagiat - porównujemy teksty.
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.
Więcej informacji o anagramach można znaleźć w serwisach poświęconych grze scrabble.
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:
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.
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:
Generowanie anagramów
Gdy chcemy utworzyć anagram dowolnego słowa, możemy posłużyć się prostym algorytmem:
Słowo zamieniamy w listę znaków, nie korzystając jednak z funkcji
sorted()– powinniśmy bowiem zachować kolejność liter.Z otrzymanej listy wybieramy losowo znak, który będzie kolejną (początkowo pierwszą) literą nowego słowa.
Z listy znaków usuwany wybraną w punkcie 2. literę.
Powtarzamy czynności opisane w punktach 2. i 3. dopóty, dopóki pozostają litery do wylosowania.
Spróbujmy napisać program, który bazując na powyższym algorytmie utworzy anagram podanego słowa. Posłużymy się pętlą while.
Oto inny wariant funkcji generującej anagramy – pokazuje on, jak w Pythonie można zminimalizować ilość kodu:
Podsumujmy najważniejsze elementy tej lekcji:
funkcja
sorted()zwraca posortowano rosnąco listę elementów podanych jako pierwszy parametr,funkcja
sorted()może posiadać parametrreverse, który pozwala zwrócić listę posortowaną w kolejności malejącej, np.sorted("BED", reverse=True) -> "DEB",metoda
L.pop(x)dla elementuLtypulistpobiera element o indeksiexi kasuje go z listy.
Słownik
(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
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 'ż')