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.

Może jutro ta dama sama da tortu jeżomAda biada i bada, A to kanapa pana Kota – co łączy te zdania? Brzmią tak samo czytane od lewej strony, jak i od prawej. To palindromy.

Patrząc na słowo, możemy bez większego problemu określić, czy jest ono palindromem, czy nie. Jednak w jaki sposób wytłumaczyć tok naszego rozumowania komputerowi i nauczyć go sprawdzania, czy podane słowo jest palindromem? Może okazać się to przydatne, gdy przyjdzie nam analizować palindromy wielowyrazowe tj.: Ada raportuje, że jutro parada, czy liczący ponad 33 tysiące liter tekst prof. Tadeusza Morawskiego Żartem w metraż.

Od niepamiętnych czasów ludzie, szukając rozrywki, bawili się również słowami. Zapewne w ten właśnie sposób powstały palindromy (z gr. palindromeo – „biec z powrotem”). Być może miały one także znaczenie magiczne... 

Przykład 1

Zdefiniujemy funkcję sprawdzającą, czy podane wyrażenie jest palindromem.

W tym celu wykorzystamy pętlę for oraz instrukcję warunkową if ... else.

Przyjmujemy następującą strategię: jeśli wyraz jest palindromem, to jego pierwsza litera będzie taka sama jak ostatnia, druga będzie taka sama jak przedostatnia itd. Dopóki nie dojdziemy do połowy wyrazu. Dalsze porównywanie nie ma sensu, ponieważ będziemy porównywać te same pary znaków.

Linia 1. def palindrom podkreślnik petla otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. dlugosc znak równości len otwórz nawias okrągły tekst zamknij nawias okrągły. Linia 3. polowa znak równości dlugosc prawy ukośnik prawy ukośnik 2. Linia 4. for i in range otwórz nawias okrągły polowa zamknij nawias okrągły dwukropek. Linia 5. if tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości tekst otwórz nawias kwadratowy dlugosc minus i minus 1 zamknij nawias kwadratowy dwukropek. Linia 6. return False. Linia 7. else dwukropek. Linia 8. return True. Linia 11. kratka przykład wywołania. Linia 13. print otwórz nawias okrągły palindrom podkreślnik petla otwórz nawias okrągły cudzysłów kobyłamamałybok cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 14. True. Linia 15. print otwórz nawias okrągły palindrom podkreślnik petla otwórz nawias okrągły cudzysłów możejutrotadamasamadatortujeżom cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 16. True. Linia 17. print otwórz nawias okrągły palindrom podkreślnik petla otwórz nawias okrągły cudzysłów Kobyła ma mały bok cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 18. False. Linia 19. print otwórz nawias okrągły palindrom podkreślnik petla otwórz nawias okrągły cudzysłów test cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 20. False.

Zapiszemy funkcję realizującą to samo zadanie z użyciem wyrażenia indeksującego. Zwróćmy uwagę, o ile krótsza jest teraz lista instrukcji:

Linia 1. def palindrom podkreślnik indeks otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. return tekst znak równości znak równości tekst otwórz nawias kwadratowy dwukropek dwukropek minus 1 zamknij nawias kwadratowy. Linia 4. kratka przykład wywołania. Linia 5. print otwórz nawias okrągły palindrom podkreślnik indeks otwórz nawias okrągły cudzysłów kobyłamamałybok cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 6. True. Linia 7. print otwórz nawias okrągły palindrom podkreślnik indeks otwórz nawias okrągły cudzysłów możejutrotadamasamadatortujeżom cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 8. True. Linia 9. print otwórz nawias okrągły palindrom podkreślnik indeks otwórz nawias okrągły cudzysłów Kobyła ma mały bok cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 10. False. Linia 11. print otwórz nawias okrągły palindrom podkreślnik indeks otwórz nawias okrągły cudzysłów test cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 12. False.
Ważne!

Pamiętajmy, że wielkość liter i znaki przestankowe mają znaczenie podczas sprawdzania, czy wyrażenie jest palindromem. Działanie pierwszej z  przedstawionych funkcji polega na porównywaniu odpowiadających sobie elementów po obu stronach ciągu. Ludzki mózg potrafi zignorować znaki, które uznaje za zbędne i brać pod uwagę wyłącznie litery (a także nie uwzględniać ich rozmiaru). Komputer nie jest w stanie tego zrobić.

Druga funkcja porównuje dwa ciągi od początku.

Jak zatem należy zdefiniować funkcję, aby móc sprawdzać bardziej skomplikowane łańcuchy znaków? Musimy najpierw pozbyć się takich elementów, jak spacja, średnik, przecinek, dwukropek, kropka, wykrzyknik lub znak zapytania, a następnie zamienić wielkie litery na małe albo małe na wielkie (czyli sprawić, że wszystkie znaki będą jednakowej wielkości). Dopiero wówczas możemy zająć się badaniem ciągu.

1
Polecenie 1

Zdefiniuj funkcję sprawdz_palindrom(tekst), która będzie działać zgodnie z przedstawionymi założeniami i wykorzysta wyrażenia indeksujące.

Dla zainteresowanych

Aby uprościć zapis naszej funkcji, możemy wykorzystać wyrażenia regularne. Ze stosowanym w tym celu parametrem r"[!?, ;:.]" zapoznamy się dokładnie w oficjalnej dokumentacji języka Python i modułu re.

Linia 1. def palindrom podkreślnik indeks podkreślnik re otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. import re. Linia 3. tekst 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 tekst zamknij nawias okrągły otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 4. tekst znak równości tekst kropka lower otwórz nawias okrągły zamknij nawias okrągły. Linia 6. return tekst znak równości znak równości tekst otwórz nawias kwadratowy dwukropek dwukropek minus 1 zamknij nawias kwadratowy. Linia 8. kratka przykład testowania. Linia 9. print otwórz nawias okrągły palindrom podkreślnik indeks podkreślnik re otwórz nawias okrągły cudzysłów Kobyła średnik ma kropka mały bok wykrzyknik cudzysłów zamknij nawias okrągły zamknij nawias okrągły. Linia 10. True.
Problem 1

Napisz program sprawdzający, czy dany napis jest palindromem.

Specyfikacja:

Dane:

  • zdanie – łańcuch znaków

Wynik:

  • Komunikat Napis jest palindromem lub Napis nie jest palindromem.

R1dwAEsBjwbBb
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.

Słownik

wyrażenie indeksujące
wyrażenie indeksujące

(ang. slice) zapisane w nawiasach kwadratowych wyrażenie, które pozwala wskazać wybraną część sekwencji; może mieć ono postać [a:b] lub [a] (bądź podobną); nazywane także wycinkiem

wyrażenia regularne
wyrażenia regularne

wzorzec pomocny podczas opisywania znaków w łańcuchu tekstowym; w języku Python dostępny w module standardowym re