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.