Posty

Wspak, ale z sensem

Tags: ["dev", "python"]

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.