Vincere Wordle con Linux

In questi ultimi giorni, se vi è capitato di fare un giro su twitter, avete sicuramente visto dei criptici messaggi contenenti dei quadratini colorati. A dispetto di qualche strano messaggio in codice, non è altro che la moda del momento, ovvero Wordle. Questo gioco online è estreamente semplice e sfidante: ogni giorno bisogna indovinare una parola di cinque lettere, avendo a disposizione solo sei tentativi. La parola cambia ogni giorno ed è possibile giocare solo una volta al giorno.

Seppur l’idea sia semplice sta davvero risquotendo un grande successo, ed è interessante tentare di capire le possibili soluzioni usando uno schema colore che ci suggerisce se abbiamo indovinato una lettera e/o se questa è al posto giusto (una reminescenza di un gioco che ricordo molto popolare anni fa, il Mastermind).

Jim Hall, che scrive sulle pagine di OpenSource.com, ha portato questa sfida sui nostri amati terminali: possiamo usare i potenti mezzi che il pinguino ci mette a disposizione per riuscire ad indovinare la parola?

Certo che si, utilizzando un dizionario di parole (generalmente incluso nelle distribuzioni Linux) ed una combinazione di grep, fgrep, e condendo il tutto con un po’ di regular expression.

Si parte da una semplice estrazione di tutte le parole di 5 lettere dal nostro dizionario, per avere una lista di possibili soluzioni:

$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
$ wc -l myguess
15034 myguess

15034 possibili soluzioni, ovviamente il tutto andrà ridotto per riuscire in massimo 6 iterazioni a trovare la parola nascosta, partendo da una parola casuale scelta tra quelle disponibili.

Wordle però ad ogni iterazione, fornisce alcune indicazioni codificate a colore: una lettera diventa gialla se è presente nella parola, ma nella posizione errata, e verde quando è la lettera esatta nella posizione giusta.

I primi due tentativi di Jim Hall

Da qui possiamo utilizzare le regular expression per andare ad assottigliare sempre di più le possibili soluzioni. Ad esempio, dopo il primo tentativo possiamo escludere che la prima lettera sia una “a”, e quindi iniziare a filtrare per

^[b-z]

Indicando che appunto dopo l’inizio riga (carattere ^) sarà presente una qualsiasi lettera compresa tra b e z. La seconda iterazione ci permette di fissare i primi due caratteri in “b” ed “a” ed ad escludere la lettera “l” dal terzo posto.

Ma questa immagine ci dice anche molto di più. Ad esempio possiamo anche escludere tutte le lettere in grigio dalle parole di oggi. Tutto questo ha permesso al buon Jim di risolvere l’indovinello del 6 Gennaio e di ridurre, in soli due tentativi, la lista di possibili parole da più di 15000 a 7 singole parole. Da questa ultima lista:

babul
bailo
bakal
bakli
banal
bauld
baulk

Ha quindi semplicemente preso la più comune: “banal”.

Sicuramente l’articolo originale è interessante, perchè seppur i comandi e le regular expression utilizzate siano molto semplici (ed ottimizzabili ulteriomente), ci mostra il processo logico utilizzato e la potenza dei tool anche più banali che abbiamo a disposizione tutti i giorni “sotto il cofano” delle sempre più moderne interfacce grafiche.

Ridurre una lista di 15000 parole a solo 7 usando una manciata di comandi non è male! Ma adesso parte la sfida. Riuscite a fare di meglio? Fateci sapere nei commenti!

Utente Linux/Unix da più di 20 anni, cerco sempre di condividere il mio know-how; occasionalmente, litigo con lo sviluppatore di Postfix e risolvo piccoli bug in GNOME. Adoro tutto ciò che può essere automatizzato e reso dinamico, l'HA e l'universo container. Autore dal 2011, provo a condividere quei piccoli tips&tricks che migliorano il lavoro e la giornata.

Tags: ,