powrót
Dwa wyrazy są anagramami, jeśli zbudowane są z tych samych zbiorów liter. Na przykład pary wyrazów:
$$adam,\ dama$$
$$algorytm,\ logarytm$$są anagramami, a wyrazy$$abcd,\ abce$$nie są.
Zadanie
Wczytaj dwa wyrazy w oddzielnych wierszach i wypisz tak, jeśli są one anagramami lub nie w przeciwnym razie.
Wejście
Dwa wyrazy złożone wyłącznie z małych liter łacińskiego alfabetu, nie dłuższe niż 1000 znaków każdy, zapisane w oddzielnych wierszach.
Wyjście
Napis tak lub nie w zależności, czy łańcuchy reprezentują anagramy, czy nie.
Rozwiązanie pod część praktyczną
Jeśli dwa wyrazy są anagramami, to po uporządkowaniu liter w każdym z nich, powinny wyglądać identycznie..
# **********algorytm.edu.pl***************
def czy_anagramy(a, b):
return "tak" if sorted(a) == sorted(b) else "nie"
# głowna część programu
a = input()
b = input()
print(czy_anagramy(a, b))
Rozwiązanie pod część teoretyczną
W tym rozwiązaniu będziemy zliczać każdą z liter pierwszego wyrazu, a następnie będziemy zmniejszać wystąpienia każdej z liter drugiego wyrazu. Jeśli ostatecznie wystąpienie każdej z liter będzie równe 0, to znaczy, że wyrazy reprezentują anagramy.
# **********algorytm.edu.pl***************
def czy_anagramy(a, b):
lista = [0] * 123 # tu będziemy przechowywać wystąpienia liter
for i in range(len(a)): lista[ord(a[i])] += 1 # zliczam litery ciągu a
for i in range(len(b)): lista[ord(b[i])] -= 1 # zmniejszam wystąpienia liter ciągu b
for i in range(ord('a'), ord('z')+1): # sprawdzam, czy ostatecznie liczba liter jest taka sama
if lista[i] != 0: return "nie"
return "tak"
# głowna część programu
a = input()
b = input()
print(czy_anagramy(a, b))
-
Definicja funkcji czy_anagramy(a, b)
: Ta funkcja przyjmuje dwa argumenty a
i b
, które są ciągami znaków (napisami). Funkcja sprawdza, czy ciągi a
i b
są anagramami.
-
Inicjowanie listy lista
: Na początku funkcji, tworzona jest lista o długości 123 (większej od alfabetu angielskiego), w której będziemy przechowywać wystąpienia liter. Każdy element listy jest początkowo ustawiany na 0.
-
Pierwsza pętla for
- zliczanie liter ciągu a
: Ta pętla przechodzi przez każdy znak w ciągu a
. Za pomocą funkcji ord()
przekształca znak w jego wartość numeryczną (kod ASCII) i zwiększa odpowiedni element listy lista
o 1. To służy do zliczania wystąpień liter w ciągu a
.
-
Druga pętla for
- zmniejszanie wystąpień liter ciągu b
: Ta pętla działa w podobny sposób do pierwszej pętli, ale zmniejsza wystąpienia liter w ciągu b
, odejmując 1 od odpowiednich elementów listy lista
.
-
Trzecia pętla for
- sprawdzanie, czy liczba liter jest taka sama: Ta pętla przechodzi przez znaki od 'a' do 'z' (czyli litery małego alfabetu) w kodzie ASCII. Dla każdej litery sprawdza, czy odpowiadający jej element listy lista
jest równy 0. Jeśli którykolwiek element nie jest równy 0, funkcja zwraca "nie", co oznacza, że ciągi a
i b
nie są anagramami.
-
Jeśli pętle for
zakończą się, to oznacza, że wszystkie litery w ciągu a
i b
wystąpiły dokładnie tyle samo razy i w odpowiednich miejscach (anagramy). W takim przypadku funkcja zwraca "tak".
-
Główna część programu: Po zdefiniowaniu funkcji czy_anagramy(a, b)
, program pobiera dwa ciągi znaków od użytkownika za pomocą funkcji input()
, a następnie wywołuje funkcję czy_anagramy(a, b)
z tymi dwoma ciągami jako argumenty i wypisuje wynik na standardowe wyjście (ekran).
Ten program porównuje wystąpienia liter w dwóch ciągach, aby określić, czy są one anagramami. Jeśli wszystkie litery występują w tych samych ilościach, program zwraca "tak"; w przeciwnym razie zwraca "nie".