Recientemente me obsesioné un poco con un juego de rompecabezas de palabras en línea en el que tienes seis intentos para adivinar una palabra aleatoria de cinco letras. La palabra cambia todos los días y solo puedes jugar una vez al día. Después de cada suposición, se resalta cada una de las letras en su suposición:gris significa que la letra no aparece en la palabra misteriosa, amarillo significa que la letra aparece en la palabra pero no en esa posición, y verde significa que la letra aparece en la palabra en esa posición correcta.
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Así es como puede usar la línea de comando de Linux para ayudarlo a jugar juegos de adivinanzas como Wordle. Usé este método para ayudarme a resolver el acertijo del 6 de enero:
Primer intento
Los sistemas Linux mantienen un diccionario de palabras en el /usr/share/dict/words
expediente. Este es un archivo de texto sin formato muy largo. El archivo de palabras de mi sistema tiene más de 479.800 entradas. El archivo contiene tanto palabras simples como nombres propios (nombres, lugares, etc.).
Para comenzar mi primera conjetura, solo quiero una lista de palabras sencillas que tengan exactamente cinco letras. Para hacer eso, uso este grep
comando:
$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
El grep
El comando utiliza expresiones regulares para realizar búsquedas. Puedes hacer mucho con las expresiones regulares, pero para ayudarme a resolver Wordle, solo necesito lo básico:el ^
significa el comienzo de una línea, y el $
significa el final de una línea. En el medio, he especificado cinco instancias de [a-z]
, que indica cualquier letra minúscula de la a a la z.
También puedo usar el wc
el comando para ver mi lista de palabras posibles es "solo" 15,000 palabras:
$ wc -l myguess
15034 myguess
De esa lista, elegí una palabra de cinco letras al azar:acres . El un se configuró en amarillo, lo que significa que la letra existe en algún lugar de la palabra misteriosa pero no en la primera posición. Las otras letras son grises, así que sé que no existen en la palabra del día.
Segundo intento
Para mi próxima suposición, quiero obtener una lista de todas las palabras que contienen una a , pero no en la primera posición. Mi lista tampoco debe incluir las letras c ,r , e , o s . Vamos a dividir esto en pasos:
Para obtener una lista de todas las palabras con a, uso el fgrep
(cadenas fijas grep) comando. El fgrep
El comando también busca texto como grep
, pero sin usar expresiones regulares:
$ fgrep a myguess > myguess2
Eso reduce mi posible lista de próximas conjeturas de 15 000 palabras a 6600 palabras:
$ wc -l myguess myguess2
15034 myguess
6634 myguess2
21668 total
Pero esa lista de palabras también incluye la letra a en la primera posición, que no quiero. El juego ya indicaba la letra a existe en alguna otra posición. Puedo modificar mi comando con grep
buscar palabras que contengan alguna otra letra en la primera posición. Eso reduce mis posibles conjeturas a solo 5500 palabras:
$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
15034 myguess
5566 myguess2
20600 total
Pero sé que la palabra misteriosa tampoco incluye las letras c , r , e , o s . Puedo usar otro grep
comando para omitir esas letras de la búsqueda:
$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
1257 myguess2
16291 total
El -v
opción significa invertir la búsqueda, por lo que grep
solo devolverá las líneas que no coincidan con la expresión regular [cres]
o la lista única de letras c , r , e , o s . Con este grep
adicional comando, reduje mi próxima conjetura considerablemente a solo 1200 palabras posibles con una a en alguna parte pero no en la primera posición, y que no contienen c , r , e , o s .
Después de ver la lista, decidí probar con la palabra balsámico .
Tercer intento
Esta vez, las letras b y un fueron resaltadas en verde, lo que significa que tengo esas letras en la posición correcta. La letra l era amarilla, por lo que esa letra existe en otra parte de la palabra, pero no en esa posición. Las letras m y y son grises, así que puedo eliminarlos de mi próxima suposición.
Para identificar mi próxima lista de posibles palabras, puedo usar otro conjunto de grep
comandos Sé que la palabra comienza con ba , para que pueda comenzar mi búsqueda allí:
$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3
¡Eso son solo 77 palabras! Puedo acotar más buscando palabras que también contengan la letra l en cualquier lugar menos en la tercera posición:
$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3
El ^
dentro de los corchetes [^l]
significa no esta lista de letras, así que no la letra l . Eso lleva mi lista de posibles palabras a 61, no todas las cuales contienen la letra l , que puedo eliminar usando otro grep
buscar:
$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3
Algunas de esas palabras pueden contener las letras m y y , que no están en la palabra misteriosa de hoy. Puedo eliminarlos de mi lista de conjeturas con un grep
invertido más buscar:
$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3
Mi lista de posibles palabras es muy corta ahora, ¡solo siete palabras!
$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk
Elegiré banales como una palabra probable para mi próxima conjetura, que resultó ser correcta.
El poder de las expresiones regulares
La línea de comandos de Linux proporciona herramientas poderosas para ayudarlo a hacer un trabajo real. El grep
y fgrep
Los comandos ofrecen una gran flexibilidad en la exploración de listas de palabras. Para un juego de adivinanzas basado en palabras, grep
ayudó a identificar una lista de 15.000 posibles palabras del día. Después de adivinar y saber qué letras aparecían y no aparecían en la palabra misteriosa, grep
y fgrep
ayudó a reducir las opciones a 1200 palabras y luego a solo siete palabras. Ese es el poder de la línea de comandos.