Wyrazy, które czytane wspak również mają sens, mogą być ciekawym pomysłem na grę słowną lub na tytuł jakiegoś dzieła. Warto by znaleźć takie pary (jak kata
i atak
).
Jako developer nie będę tego robił ręcznie. Zgarnę słownik i się pobawię nim w Pythonie.
(Aby przekonwertować powyższy słownik do UTF-8 użyłem iconv -f windows-1250 -t utf-8 slowa-win.txt > dict.txt
.)
Mam listę wyrazów oddzielonych nową linią. Najpierw wczytuję dane do pythonowego zbioru.
dict_normal = set()
with open('dict.txt') as dictionary:
for word in dictionary:
word = word[:-1]
dict_normal.add(word)
Powyżej word = word[:-1]
służy usunięciu znaku nowej linii (\n
) z każdego wyrazu.
Następnie generuję drugi zbiór, w którym będą wszystkie wyrazy zapisane wspak. Przykładowo zamiast kajak
będzie kajak
. Okay, to nie jest najlepszy przykład. Lepszym będzie para przykład
oraz dałkyzrp
.
dict_back = {word[::-1] for word in dict_normal}
I mam wszystko, co potrzebne. Zauważmy, że jeśli wyraz jest w obu zbiorach (tj. dict_normal
oraz dict_back
) to znaczy, że ma sens zarówno czytany wspak, jak i normalnie.
Wynik będzie intersekcją (częścią wspólną) obu zbiorów.
result = dict_normal.intersection(dict_back)
W ten sposób, oprócz typowych takich par (port
, trop
; metraż
, żartem
; grat
, targ
), znajdziemy również zwyczajne palindromy (kajak
, rotator
, wyryw
).
Swoją drogą, czy ta własność ma swoją nazwę? Każdy taki wyraz to coś pomiędzy sotadicum a palindromem, z domieszką anagramu.