Ricerca nel sito web

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.

Articoli correlati: