Résoudre Wordle en utilisant la ligne de commande Linux

Je suis récemment devenu un peu obsédé par un jeu de puzzle de mots en ligne dans lequel vous avez six tentatives pour deviner un mot aléatoire de cinq lettres. Le mot change tous les jours et vous ne pouvez jouer qu’une fois par jour. Après chaque supposition, chacune des lettres de votre supposition est mise en surbrillance : le gris signifie que la lettre n’apparaît pas dans le mot mystère, le jaune signifie que la lettre apparaît dans le mot mais pas à cette position, et le vert signifie que la lettre apparaît dans le mot à cette position correcte.
Voici comment vous pouvez utiliser la ligne de commande Linux pour vous aider à jouer à des jeux de devinettes comme Wordle. J’ai utilisé cette méthode pour m’aider à résoudre l’énigme du 6 janvier :
Premier essai
Les systèmes Linux conservent un dictionnaire de mots dans le /usr/share/dict/words
déposer. Il s’agit d’un très long fichier texte brut. Le fichier de mots de mon système contient plus de 479 800 entrées. Le fichier contient à la fois des mots simples et des noms propres (noms, lieux, etc.).
Pour commencer ma première supposition, je veux juste une liste de mots simples contenant exactement cinq lettres. Pour ce faire, j’utilise ceci grep
commander:
$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
le grep
La commande utilise des expressions régulières pour effectuer des recherches. Vous pouvez faire beaucoup avec les expressions régulières, mais pour m’aider à résoudre Wordle, je n’ai besoin que des bases : ^
signifie le début d’une ligne, et le $
signifie la fin d’une ligne. Entre les deux, j’ai spécifié cinq instances de [a-z]
, qui indique toute lettre minuscule de a à z.
je peux aussi utiliser le wc
commande pour voir ma liste de mots possibles est “seulement” 15 000 mots :
$ wc -l myguess
15034 myguess
Dans cette liste, j’ai choisi un mot de cinq lettres au hasard : acres. le une était réglé sur jaune, ce qui signifie que cette lettre existe quelque part dans le mot mystère mais pas en première position. Les autres lettres sont grises, donc je sais qu’elles n’existent pas dans le mot du jour.
Deuxième essai
Pour ma prochaine supposition, je veux obtenir une liste de tous les mots qui contiennent un une, mais pas en première position. Ma liste ne devrait pas non plus inclure les lettres c, r, e, ou s. Décomposons cela en étapes :
Pour obtenir une liste de tous les mots avec un a, j’utilise le fgrep
(chaînes fixes grep) commande. le fgrep
commande recherche également du texte comme grep
, mais sans utiliser d’expressions régulières :
$ fgrep a myguess > myguess2
Cela ramène ma liste possible de prochaines suppositions de 15 000 mots à 6 600 mots :
$ wc -l myguess myguess2
15034 myguess
6634 myguess2
21668 total
Mais cette liste de mots comprend également la lettre une en première position, ce que je ne veux pas. Le jeu indiquait déjà la lettre une existe dans une autre position. Je peux modifier ma commande avec grep
pour rechercher des mots contenant une autre lettre en première position. Cela réduit mes suppositions possibles à seulement 5 500 mots :
$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
15034 myguess
5566 myguess2
20600 total
Mais je sais que le mot mystère n’inclut pas non plus les lettres c, r, e, ou s. je peux en utiliser un autre grep
commande pour omettre ces lettres de la recherche :
$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
1257 myguess2
16291 total
le -v
option signifie inverser la recherche, donc grep
ne renverra que les lignes qui ne correspondent pas à l’expression régulière [cres]
ou la liste unique de lettres c, r, e, ou s. Avec ce supplément grep
commande, j’ai considérablement réduit ma prochaine supposition à seulement 1 200 mots possibles avec un a quelque part mais pas en première position, et qui ne contiennent pas c, r, e, ou s.
Après avoir consulté la liste, j’ai décidé d’essayer le mot embaumé.
Troisième essai
Cette fois, les lettres b et une ont été surlignés en vert, ce qui signifie que j’ai ces lettres dans la bonne position. La lettre je était jaune, de sorte que cette lettre existe ailleurs dans le mot, mais pas à cette position. Les lettres m et y sont gris, donc je peux les éliminer de ma prochaine supposition.
Pour identifier ma prochaine liste de mots possibles, je peux utiliser un autre ensemble de grep
commandes. Je sais que le mot commence par ba, donc je peux commencer ma recherche ici:
$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3
C’est seulement 77 mots! Je peux réduire cela davantage en recherchant des mots qui contiennent également la lettre je n’importe où sauf la troisième position :
$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3
le ^
à l’intérieur des crochets [^l]
signifie pas cette liste de lettres, donc pas la lettre je. Cela porte ma liste de mots possibles à 61, qui ne contiennent pas tous la lettre je, que je peux éliminer en utilisant un autre grep
chercher:
$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3
Certains de ces mots peuvent contenir les lettres m et y, qui ne sont pas dans le mot mystère d’aujourd’hui. Je peux supprimer ceux de ma liste de suppositions avec un autre inversé grep
chercher:
$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3
Ma liste de mots possibles est maintenant très courte, seulement sept mots !
$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk
je choisirai banal comme un mot probable pour ma prochaine supposition, qui s’est avérée correcte.
La puissance des expressions régulières
La ligne de commande Linux fournit des outils puissants pour vous aider à faire un vrai travail. le grep
et fgrep
Les commandes offrent une grande flexibilité dans l’analyse des listes de mots. Pour un jeu de devinettes basé sur des mots, grep
aidé à identifier une liste de 15 000 mots possibles du jour. Après avoir deviné et su quelles lettres apparaissaient et n’apparaissaient pas dans le mot mystère, grep
et fgrep
a aidé à réduire les options à 1 200 mots, puis à seulement sept mots. C’est la puissance de la ligne de commande.