Dziś Pchełka dość krótka, za to całkiem interesująca, ponieważ podczas jej pisania poznałem nową konstrukcję języka SQL (a konkretnie jego microsoftowej odmiany czyli TSQL).
W ramach zabaw z nową wersją SQL Servera zaciągnąłem sobie do bazy słownik polski oraz angielski.
Ograniczyłem się do słów o długości nieprzekraczającej 15 znaków - tyle bowiem ma w każdą stronę plansza do Literaków.
Tabelki mam teraz dwie: slowa_en oraz slowa_pl. Obydwie napełniłem danymi za pomocą wbudowanego w SQL Server Management Studio Kreatora Importu Danych.
Polskie słówka wziąłem stąd:
http://sjp.pl/slownik/growy/
A angielskie stąd:
https://raw.githubusercontent.com/docdis/english-words/master/words2.txt
Dalej już poszło łatwo:
with q1 as (
select
pl.slowo pl,
en.slowo en
from
slowa_pl pl
join slowa_en en
on pl.slowo = reverse(en.slowo)
and pl.slowo <> reverse(pl.slowo)
where
len(pl.slowo) >= 6
)
select
STRING_AGG(pl, ', ') within group (order by pl) slowa_pl,
STRING_AGG(en, ', ' ) within group (order by pl) slowa_en
from q1
Wynik:
slowa_pl: abulik, amonalem, arenom, argona, asanom, darter, detale, dewonu, diolem, diolom, diorama, elitom, emiter, enotek, erosem, esemes, etamina, etanal, etatem, laisem, lamina, latrom, lianga, liasem, manitu, mijane, murala, nalata, nalatam, natrap, negrom, nitarek, nodoid, pustak, rediom, regres, rekinom, reksom, rematem, renifer, report, rotule, sporem, tenakla, terami
slowa_en: kiluba, melanoma, monera, anogra, monasa, retrad, elated, unowed, meloid, moloid, amaroid, motile, retime, ketone, mesore, semese, animate, lanate, metate, mesial, animal, mortal, agnail, mesail, utinam, enajim, alarum, atalan, matalan, partan, morgen, keratin, diodon, katsup, moider, serger, moniker, mosker, metamer, refiner, troper, elutor, merops, alkanet, imaret
Objaśnienie kodu:
W podzapytaniu q1 wyszukujemy w tabeli z polskimi słówkami takich wyrazów, które przeczytane od tyłu istnieją w słowniku angielskim, ale które zarazem nie są palindromami. Ponieważ jednak jest ich aż 946, żeby nie zaśmiecać wpisu ograniczam się do słów co najmniej sześcioliterowych.
A potem - w zapytaniu głównym - używamy funkcji STRING_AGG, która zamienia wiele wartości tekstowych w kolumnie na jedną wartość w wierszu. Ciekawostką jest możliwość posortowania zgrupowanych wartości - w przykładzie powyżej zarówno słówka polskie jak i angielskie sortuję tym samym kluczem (słowo polskie), dzięki czemu słowa polskie na kolejnych pozycjach odpowiadają przeczytanym wspak słowom angielskim na tych samych pozycjach.
Smutne jest to, że spośród wymienionych tu czterdziestu pięciu par słówek tylko w przypadku czterech z nich rozumiem zarówno polskie jak i angielskie. Które to są - nie powiem 😉 ale szału nie ma.
Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]
Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.