Risolvi Wordle usando la riga di comando di Linux
Usa i comandi grep e fgrep di Linux per vincere i tuoi indovinelli preferiti basati su parole.
Recentemente sono diventato un po' ossessionato da un gioco di puzzle di parole online in cui hai sei tentativi per indovinare una parola casuale di cinque lettere. La parola cambia ogni giorno e puoi giocare solo una volta al giorno. Dopo ogni tentativo, ciascuna delle lettere indovinate viene evidenziata: grigio significa che la lettera non appare nella parola misteriosa, giallo significa che la lettera appare nella parola ma non in quella posizione e verde significa che la lettera appare nella parola in quella posizione corretta.
Ecco come puoi utilizzare la riga di comando di Linux per aiutarti a giocare a indovinelli come Wordle. Ho usato questo metodo per aiutarmi a risolvere il puzzle del 6 gennaio:
Primo tentativo
I sistemi Linux mantengono un dizionario di parole nel file /usr/share/dict/words
. Questo è un file di testo semplice molto lungo. Il file di parole del mio sistema contiene oltre 479.800 voci. Il file contiene sia parole semplici che nomi propri (nomi, luoghi e così via).
Per iniziare la mia prima ipotesi, voglio solo un elenco di parole semplici lunghe esattamente cinque lettere. Per fare ciò, utilizzo questo comando grep
:
$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
Il comando grep
utilizza espressioni regolari per eseguire ricerche. Puoi fare molto con le espressioni regolari, ma per aiutarmi a risolvere Wordle, ho solo bisogno delle nozioni di base: ^
significa l'inizio di una riga e $
significa il fine di una riga. Nel mezzo, ho specificato cinque istanze di [a-z]
, che indica qualsiasi lettera minuscola dalla a alla z.
Posso anche usare il comando wc
per vedere che il mio elenco di parole possibili contiene "solo" 15.000 parole:
$ wc -l myguess
15034 myguess
Da quell'elenco ho scelto una parola casuale di cinque lettere: acri. La a è stata impostata su giallo, il che significa che la lettera esiste da qualche parte nella parola misteriosa ma non nella prima posizione. Le altre lettere sono grigie, quindi so che non esistono nella parola del giorno.
Jim Hall (CC BY-SA 4.0)
Secondo tentativo
Per la mia prossima ipotesi, voglio ottenere un elenco di tutte le parole che contengono una a, ma non nella prima posizione. Inoltre, il mio elenco non dovrebbe includere le lettere c, r, e o s. Suddividiamo il tutto in passaggi:
Per ottenere un elenco di tutte le parole con una a, utilizzo il comando fgrep
(fixed strings grep). Il comando fgrep
cerca anche testo come grep
, ma senza utilizzare espressioni regolari:
$ fgrep a myguess > myguess2
Ciò riduce il mio possibile elenco di prossime ipotesi da 15.000 parole a 6.600 parole:
$ wc -l myguess myguess2
15034 myguess
6634 myguess2
21668 total
Ma quell'elenco di parole include anche la lettera a nella prima posizione, cosa che non voglio. Il gioco già indicava che la lettera a esiste in qualche altra posizione. Posso modificare il mio comando con grep
per cercare parole contenenti qualche altra lettera nella prima posizione. Ciò restringe le mie possibili ipotesi a sole 5.500 parole:
$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
15034 myguess
5566 myguess2
20600 total
Ma so che la parola misteriosa non include nemmeno le lettere c, r, e o s. Posso usare un altro comando grep
per omettere quelle lettere dalla ricerca:
$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
1257 myguess2
16291 total
L'opzione -v
significa invertire la ricerca, quindi grep
restituirà solo le righe che non corrispondono all'espressione regolare [cres]
o al elenco singolo di lettere c, r, e o s. Con questo comando grep
aggiuntivo, ho ristretto considerevolmente la mia ipotesi successiva a sole 1.200 parole possibili con una a da qualche parte ma non nella prima posizione e che non contengono c , r, e o s.
Dopo aver visionato l'elenco, ho deciso di provare la parola balsamico.
Jim Hall (CC BY-SA 4.0)
Terzo tentativo
Questa volta le lettere b e a sono state evidenziate in verde, il che significa che ho quelle lettere nella posizione corretta. La lettera l era gialla, quindi quella lettera esiste da qualche altra parte nella parola, ma non in quella posizione. Le lettere m e y sono grigie, quindi posso eliminarle dalla mia prossima ipotesi.
Per identificare il prossimo elenco di possibili parole, posso utilizzare un altro set di comandi grep
. So che la parola inizia con ba, quindi posso iniziare la mia ricerca da lì:
$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3
Sono solo 77 parole! Posso restringere ulteriormente il campo cercando parole che contengano anche la lettera l ovunque tranne che nella terza posizione:
$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3
Il ^
all'interno delle parentesi quadre [^l]
non significa questo elenco di lettere, quindi non la lettera l. Ciò porta il mio elenco di possibili parole a 61, non tutte contenenti la lettera l, che posso eliminare utilizzando un'altra ricerca grep
:
$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3
Alcune di queste parole potrebbero contenere le lettere m e y, che non si trovano nella parola misteriosa di oggi. Posso rimuoverli dal mio elenco di ipotesi con un'altra ricerca grep
invertita:
$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3
La mia lista di parole possibili è ormai molto breve, solo sette parole!
$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk
Sceglierò banale come parola probabile per la mia prossima ipotesi, che si è rivelata corretta.
Jim Hall (CC BY-SA 4.0)
Il potere delle espressioni regolari
La riga di comando di Linux fornisce strumenti potenti per aiutarti a svolgere il lavoro reale. I comandi grep
e fgrep
offrono una grande flessibilità nella scansione di elenchi di parole. Per un gioco d'ipotesi basato sulle parole, grep
ha aiutato a identificare un elenco di 15.000 possibili parole del giorno. Dopo aver indovinato e saputo quali lettere apparivano e non apparivano nella parola misteriosa, grep
e fgrep
hanno aiutato a restringere le opzioni a 1.200 parole e poi a sole sette parole. Questo è il potere della riga di comando.