Rozwiązanie zagadki o nazwach województw

https://xpil.eu/x1z

Postawiona niedawno zagadka była nie całkiem banalna, ale przy odrobinie znajomości dowolnego języka programowania dało się ją rozwiązać względnie prosto.

Oryginalnie zagadkę rozwiązałem przy użyciu SQL, ale potem kilku Czytelników nadesłało swoje rozwiązania oparte na linuksowym wierszu poleceń i moje starannie skonstruowane zapytania i przekształcenia przestały mi się podobać - były wolne i zajmowały mnóstwo miejsca. Dlatego przepisałem całość od zera, tym razem w BASH-u. Trochę ściągnąłem z Waszych rozwiązań, trochę pokombinowałem - efekt poniżej.

Skrypt nazywa się main.sh i robi wszystko - ściąga słownik ze strony sjp.pl, potem konwertuje go do bardziej zjadliwej postaci, wreszcie wyszukuje najdłuższe niedopasowane słowo do tego, które dostał jako parametr w wierszu poleceń.

Skrypt wygląda tak:

#FN=https://sjp.pl/slownik/odmiany/sjp-odm-20200704.zip
#FN2=sjp-odm-20200704.zip
#rm -rf ./sjp*.zip
#rm -rf ./odm.txt
#wget $FN
#unzip $FN2 odm.txt
#cat ./odm.txt | tr ', ', '\n' | sed '/^$/d' | sort | uniq > odm2.txt
#rm ./odm.txt
#mv ./odm2.txt ./odm.txt
##### linie powyżej przygotowują słownik - wystarczy to uruchomić tylko raz #####
LW=$(echo "$1" | grep -o . | sort | uniq | tr -d "\n")
MAXL=$(cat odm.txt | grep -iv "[$LW]" | wc -L)
echo "$1", "$MAXL", $(grep -E "^.{$MAXL}\$" odm.txt | grep -iv "[$LW]")

Jak widać po ściągnięciu i sformatowaniu słownika wystarczą trzy linie kodu: pierwsza wyciąga unikalne litery z nazwy województwa (LW), druga ustala długość najdłuższego niedopasowanego słowa (MAXL), trzecia wyświetla wszystkie niedopasowane słowa o tej długości

Kluczowym elementem jest tutaj wyrażenie regularne "^.{$MAXL}\$" oznaczające ciąg dowolnych znaków o zadanej długości.

Oprócz tego całkiem interesujące jest też wyznaczenie unikalnych liter nazwy województwa: LW=$(echo "$1" | grep -o . | sort | uniq | tr -d "\n")

Tu najpierw "pionizujemy" nawę województwa (po jednej literze na linię), potem sortujemy i usuwamy duplikaty, a na końcu "depionizujemy" za pomocą tr. Sortowanie jest po to, żeby ewentualny myślnik trafił na początek, dzięki czemu nie popsuje nam późniejszego grep-a.

I chociaż skrypt przeszukuje słownik dwukrotnie, wykonuje się w czasie poniżej jednej sekundy - zostawiam jak jest, bez dalszych optymalizacji.

Zrobiłem sobie też dodatkowy plik wojewodztwa.txt, zawierający nazwy województw (po jednej na linię). Potem wystarczyło wykonać:

cat wojewodztwa.txt | xargs -L 1 ./main.sh

... i efekt gotowy:

dolnośląskie, 17, przychwytywałabym przytrzymywaczach przytrzymywałabym przyzwyczajałabym
kujawsko-pomorskie, 11, bydlęcących
lubelskie, 23, cytrynowopomarańczowych wychowawczo-poprawczych
lubuskie, 23, cytrynowopomarańczowych wychowawczo-poprawczych
łódzkie, 23, autobusowo-tramwajowych
małopolskie, 15, hybrydyzujących wytrząchujących wyzgrzytujących
mazowieckie, 12, śródpustynny śródpustynną
opolskie, 18, antyawangardyzmach nabuńczuczyłybyśmy nachałturzyłybyśmy nawybrzydzałybyśmy wyfrymarczałybyśmy wyzgrzytywałybyśmy zachachmęcałybyśmy zachałturzyłybyśmy
podkarpackie, 15, wybłysnęłybyśmy wygłuszyłybyśmy wywyższyłybyśmy
podlaskie, 17, wytrząchnęłybyśmy
pomorskie, 16, antywynalazczych nabuńczuczyłabyś zgaduj-zgadulach
śląskie, 23, brunatno-żółto-rdzawych cytrynowopomarańczowych wychowawczo-poprawczych
świętokrzyskie, 13, Guadalcanalu amalgamacjach babach-jagach
warmińsko-mazurskie, 11, bydlęcących półpłynnych
wielkopolskie, 18, nabuńczuczyłybyśmy nachałturzyłybyśmy zachachmęcałybyśmy zachałturzyłybyśmy
zachodniopomorskie, 10, wyjutubują wyjutubuję wytężyłbyś wytężyłyby

Najdłuższe słowa niedopasowane znaleziono dla województw łódzkiego, śląskiego, lubelskiego i lubuskiego. Najkrótsze - dla zachodniopomorskiego.


Do zagadki podeszło kilku Czytelników.

Rozie najpierw zagadnienie zoptymalizował - usunął z oryginalnego słownika wszystkie słowa zawierające litery "e", "i" oraz "k" ponieważ występują one w każdej nazwie województwa. Tym samym zmniejszył sobie słownik o rząd wielkości. A potem machnął dwa skrypty w Pythonie, posklejał je bashem i mu Wyszło.

Butter rozwiązał zagadkę poprawnie, choć nie pochwalił się swoim kodem.

Waldek również nie pokazał swojego kodu. Był on blisko poprawnej odpowiedzi, ale z jakiegoś powodu umknęło mu województwo łódzkie. Potem pobawił się pomysłem w szerszym zakresie: listę nazw województw można przecież zastąpić listą nazw stolic województw lub inną dowolnie wybraną listą - możliwości są w zasadzie nieskończone.

Krzysiek i Canthar napisali zgrabne programy w Pythonie i obaj dostali prawidłowe wyniki. Canthar dodatkowo okrasił swój skrypt garścią przemyśleń o wielkich i małych literach.

https://xpil.eu/x1z

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.