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.
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
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
dossier. 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 ce grep
commande :
$ 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 :Le ^
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 un é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 a , mais pas en première position. Ma liste ne doit 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
la commande recherche également du texte comme grep
, mais sans utiliser d'expressions régulières :
$ fgrep a myguess > myguess2
Cela fait passer ma liste de suppositions possibles 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 a en première position, ce que je ne veux pas. Le jeu indiquait déjà la lettre a 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 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 grep
supplémentaire 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 douce .
Troisième essai
Cette fois, les lettres b et un ont été surlignés en vert, ce qui signifie que j'ai ces lettres dans la bonne position. La lettrel é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 , pour que je puisse 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 l n'importe où sauf en troisième position :
$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3
Le ^
entre crochets [^l]
signifie pas cette liste de lettres, donc pas la lettre l . Cela porte ma liste de mots possibles à 61, qui ne contiennent pas tous la lettre l , que je peux éliminer en utilisant un autre grep
rechercher :
$ 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 les supprimer de ma liste de suppositions avec un autre grep
inversé rechercher :
$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3
Ma liste de mots possibles est très courte maintenant, seulement sept mots !
$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk
Je vais choisir banal comme 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.