Pchełki SQL: ga-de-ry-po-lu-ki

https://xpil.eu/PjLw5

Dziś powrót do dzieciństwa, czyli uproszczona wersja szyfru Cezara w aranżacji na jeden serwer i bloga.

Tłumacząc na nasze: spróbujemy znaleźć wszystkie słowa języka polskiego, które zaszyfrowane za pomocą ga-de-ry-po-lu-ki dadzą inne słowo języka polskiego.

Podejście do tematu jest dwuetapowe: najpierw tworzymy funkcję, która wylicza gaderypoluki z zadanego słowa, a następnie w drugim kroku używamy tej funkcji do znalezienia interesujących nas słówek.

No to lecimy:

Krok 1: tworzymy funkcję fnGaDeRyPoLuKi:

IF object_id(N'dbo.fnGaDeRyPoLuKi', N'FN') IS NOT NULL
	DROP FUNCTION dbo.fnGaDeRyPoLuKi
GO
CREATE FUNCTION dbo.fnGaDeRyPoLuKi (@strTekst NVARCHAR(15))
RETURNS NVARCHAR(15)
AS BEGIN
  DECLARE @strTmp NVARCHAR(15) = '', @i INT = 1;

  WHILE @i <= LEN(@strTekst)
  BEGIN
    SET @strTmp = @strTmp 
    + CASE substring(@strTekst, @i, 1)
      WHEN 'g' THEN 'a'
      WHEN 'a' THEN 'g'
      WHEN 'd' THEN 'e'
      WHEN 'e' THEN 'd'
      WHEN 'r' THEN 'y'
      WHEN 'y' THEN 'r'
      WHEN 'p' THEN 'o'
      WHEN 'o' THEN 'p'
      WHEN 'l' THEN 'u'
      WHEN 'u' THEN 'l'
      WHEN 'k' THEN 'i'
      WHEN 'i' THEN 'k'
      ELSE substring(@strTekst, @i, 1)
    END --case
    SET @i += 1
  END --while
  RETURN (@strTmp)
END -- create function
GO

Przy okazji pisania dzisiejszego wpisu nauczyłem się, że funkcja OBJECT_ID ma drugi parametr, w przypadku kiedy szukamy identyfikatora obiektu konkretnego typu.

Sprawdzamy, czy funkcja działa:

SELECT dbo.fnGaDeRyPoLuKi('ale nudy!')

Wynik:
gud nler!

Przy okazji wygląda na to, że zrobiliśmy tłumacza z polskiego na holenderski. Nic nie szkodzi, tak się czasem zdarza, nie martwimy się tym i lecimy z etapem drugim:

SELECT s1.slowo
FROM dbo.slowka s1
INNER JOIN slowka s2 ON s1.slowo = dbo.fnGaDeRyPoLuKi(s2.slowo)
	AND s1.slowo <> s2.slowo;

Metoda jest prosta: szukamy takich słówek, których zaszyfrowana postać również istnieje w tabeli (pierwszy warunek JOIN), a zarazem jest różna od oryginału (drugi warunek), w przeciwnym razie dostalibyśmy również słówka, które nie zawierają żadnej z liter 'g','a','d','e','r','y','p','o','l','u','k','i'.

Po chwili namysłu (u mnie: 37 sekund) dostajemy na wyjściu całkiem sporo słówek. Sprawdźmy najdłuższe z nich, te bowiem są najciekawsze. Jest sześć słówek siedmioliterowych, rzućmy okiem: 'apulską', 'chrupną', 'chyloną', 'fruktów', 'fylitów','golusią'. Liczba słówek sześcioliterowych to 10, 40 pięcioliterówek, 66 czteroliterówek oraz 54 trzyliterówki. Jak widać liczby słów w poszczególnych kategoriach są parzyste - każde z nich ma swój odpowiednik gaderypoluki w tym samym zbiorze.

Odszukanie tych słówek pozostawiam najbardziej zdeterminowanym Czytelnikom, którzy bez tej informacji nie będą w stanie spokojnie zasnąć. A reszcie życzę takiej wytrwałości w dążeniu do celu, jaką wykazaliście w lekturze tego wpisu 😉

https://xpil.eu/PjLw5

Leave a Comment

Komentarze mile widziane.

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.