He estado mirando la aplicación Wordle y me parece que es bastante fácil de duplicar. Me estoy enseñando a mí mismo a programar scripts de shell, así que me pregunto si hay una manera de crear un Wordle para la línea de comandos en Linux.

Hay mucho en Wordle que fue realmente inteligente desde el primer lanzamiento, no menos de los cuales es que es fácil de entender y difícil de dominar. Dado que solo tiene un rompecabezas de palabras por día, también es un juego casual perfecto para un dispositivo móvil en el camino a la escuela, al trabajo, incluso mientras está acostado en la cama, despertándose lentamente. Seis conjeturas. Cinco letras. Muestra si adivina una letra en el espacio correcto, una letra que está en la palabra pero no en el primer espacio, y cualquier letra que haya adivinado que falte en la palabra.

La otra faceta que funcionó realmente bueno es que es muy fácil compartir tus resultados con amigos en las redes sociales. Por supuesto, los amigos que no juegan Wordle no estarán interesados, pero oye, aquellos que lo hacen pueden comparar fácilmente su número de intentos con el tuyo, ¡y dulces son los días en los que obtienes la palabra con solo unos pocos intentos! Como no hay pistas, definitivamente es difícil porque hay miles y miles de palabras de 5 letras en el diccionario de inglés.

Aún así, si puede codificarlo, también puede codificarlo como un script de shell, aunque puede que no sea el más eficiente o elegante (particularmente en comparación con el simple y efectivo diseño de la aplicación móvil). Profundicemos y veamos cómo recrear Wordle como un script de shell de Linux y MacOS.

PASO 1: SELECCIONE UNA PALABRA DEL DICCIONARIO

Varias distribuciones de Linux incluyen diccionarios, pero a menudo incluyen cientos de palabras bastante oscuras que ni siquiera aparecen en los diccionarios estándar del idioma inglés. El juego no es divertido si te pide palabras de las que nunca has oído hablar, ¿verdad? Afortunadamente, la Web llega y hay un buen archivo de texto de unas 5000 palabras en inglés de 5 letras que puede obtener directamente de la red en

https://www-cs-faculty.stanford.edu/~knuth/sgb-words.txt

Tómalo y guárdalo como”5-letter-palabras.txt”. A continuación, defina una variable para que podamos referirnos a ella como”dict”en el futuro:

dict=”5-letter-words.txt”.

Ahora entremos en la primera parte interesante de la codificación: Elegir una palabra aleatoria de un archivo de texto. Esto se puede hacer calculando el número de líneas en el archivo, luego usando la variable incorporada $RANDOM en el shell para generar un número entero aleatorio 2**32, modificado para que esté entre 0 y el número de líneas – 1:

# 1. Elige una palabra de la lista líneas=”$(wc-l <​​$dict)"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"

Esperemos que todo esté claro para ti, usando $randomchoice para recordar qué línea queremos, luego head|tail para sacar esa línea del diccionario. El resultado es que $palabra es la palabra a adivinar.

Ahora, mientras lo tenemos, dividámoslo en cinco variables de una letra. Hay muchas maneras de hacerlo, pero usaré un corte simple en un enfoque de subcapa:

w1=”$(echo $word | cut-c1)”; w2=”$(echo $palabra | cortar-c2)”w3=”$(echo $palabra | cortar-c3)”; w4=”$(echo $palabra | cut-c4)”w5=”$(echo $palabra | cut-c5)”

El primer paso ha terminado. $word contiene la palabra a adivinar y $w1 a $w5 contienen las cinco letras que componen esa palabra.

PASO 2: SOLICITE AL USUARIO SU CONJURACIÓN

El segundo paso es crear un bucle y dentro de él pide al usuario su suposición. Fácil de hacer:

hasta que [ 0-eq 1 ] ; do echo”\nGuess: \c”leer respuesta más código irá aquí hecho

El resto de nuestro código (con la excepción de una función que aparecerá en un momento) se guardará después de’leer respuesta’pero antes’hecho’. Mientras procesamos la conjetura, dividámosla también en cinco variables secuenciales:

a1=”$(echo $respuesta | cut-c1)”; a2=”$(echo $respuesta | cut-c2)”a3=”$(echo $respuesta | cut-c3)”; a4=”$(echo $respuesta | cut-c4)”a5=”$(echo $respuesta | cut-c5)”

Siempre puede segmentar una variable con una notación ${varname:x:y}, pero Prefiero variables separadas para mayor claridad.

PASO 3: COMPRUEBE LA CONJURACIÓN CONTRA EL DICCIONARIO

Dado que una de las reglas de Wordle es que su conjetura debe ser una palabra adecuada en inglés, necesitaremos para comprobar eso también. Resulta que es bastante fácil…

if [“$(grep-E”^$answer\$”$dict)”=””] ; entonces # ¿La respuesta está en el diccionario? Si no, no lo evalúes? echo”Tu suposición no está en mi diccionario”. else

He formateado esto como condicional porque es una de varias pruebas que aplicaremos…

PASO 4: COMPARE CADA LETRA CONTRA EL OBJETIVO

El siguiente paso , y con mucho la más complicada, es probar cada letra de la conjetura del usuario no solo con la misma ranura de letra en la palabra objetivo, sino con todas las letras de la palabra. Para lograr esto, voy a crear una función de shell:

lettercheck() { # answer-letter lettercount # todas las letras de respuesta ya están en w1 w2 etc. # devuelve el valor en”$returnchar”if [“$1″=”$(eco de evaluación \$w$2)”] ; luego # letra adivinada en el lugar correcto! returnchar=”$(echo $1 | tr”[:inferior:]””[:superior:]”)”elif [“$(echo $palabra | grep”$1″)”!=””] ; luego # letra presente, lugar incorrecto (necesita refinamiento) returnchar=”$1″else # letra no presente en la palabra returnchar=”-“fi }

Dado que puede pasar variables a funciones en el shell, se invocará con el primer parámetro la letra adivinada y el segundo parámetro el espacio ordinal (en otras palabras, si adivino”carambola”, entonces la letra 3 sería”r”y sería la letra #3 en mi suposición.

Como no puedo cambiar el color de las letras adivinadas, en su lugar estoy usando la notación de que hacer eco de la suposición con una letra transliterada a mayúscula significa que es la letra correcta en el lugar correcto, si está en minúsculas, entonces es la letra correcta en el lugar equivocado, y si es solo un”-“, es una letra que no está presente. ¿Puedes ver cómo se muestra todo eso en el código anterior?

PASO 5: EVALUAR CONJUSTE CON LETTERCHECK

Con la función escrita, es hora de utilizarla, y así es como lo hago:

echo”Resultado de su conjetura: \c”lettercheck”$a1″1 ; echo”$retur nchar \c”lettercheck”$a2″2 ; echo”$returnchar \c”lettercheck”$a3″3 ; echo”$returnchar \c”lettercheck”$a4″4 ; echo”$returnchar \c”lettercheck”$a5″5 ; echo”$returnchar”

Aprovecho la notación \c en echo para que no incluya un retorno de carro, lo que permite que el script cree una línea de salida letra por letra. ¡Práctico!

PONIENDO TODO JUNTO

Antes de mostrarte todo el código con bucles, echemos un vistazo a la salida, un juego rápido de SHWORDLE:

$ sh shwordle.sh Adivina: birds Resultado de tu suposición:—-S Adivina: carps Resultado de tu suposición:-a–S Adivina: carretes Resultado de tu suposición:-E e L S Adivina: celos Lo has adivinado: ¡CELOS! Bien hecho.

Hice trampa porque sabía la palabra de antemano, pero puedes ver que es difícil, pero cuando recuerdas que mayúsculas significa letra correcta, espacio correcto y minúsculas significa letra correcta, espacio incorrecto, funciona perfectamente. Bueno, no del todo, pero volveré a eso.

Por ahora, aquí está el guión completo, línea por línea, incluidos los comentarios:

#!/bin/sh # SHWORDLE-Funcionalidad duplicada del juego de adivinanzas de palabras Wordle # escrito por Dave Taylor. Todavía tiene algunos errores para solucionar. dict=”/Users/taylor/bin/5-letter-words.txt”lettercheck() { # número de letras de respuesta # todas las letras de respuesta ya están en w1 w2 etc. # devuelve el valor en”$returnchar”si [“$1″=”$(eval eco \$w$2)”] ; luego # letra adivinada en el lugar correcto! returnchar=”$(echo $1 | tr”[:inferior:]””[:superior:]”)”elif [“$(echo $palabra | grep”$1″)”!=””] ; luego # letra presente, lugar equivocado (necesita refinamiento) returnchar=”$1″else # letra no presente en la palabra returnchar=”-“fi } # 1. Escoja una palabra de la lista lines=”$(wc-l <​​$dict )"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"w1="$(echo $word | cut-c1)"; w2="$(echo $palabra | cortar-c2)"w3="$(echo $palabra | cortar-c3)"; w4="$(echo $palabra | cut-c4)"w5="$(echo $palabra | cut-c5)"# aquí hay un truco: echo"--$palabra--$w1 $w2 $w3 $w4 $ w5"# 2. Bucle para pedirle al usuario que adivine. hasta [ 0-eq 1 ] ; haga echo"\nGuess: \c"lea la respuesta # 3. divida la palabra adivinada en letras a1="$(echo $respuesta | cut-c1)"; a2="$(echo $respuesta | cut-c2)"a3="$(echo $respuesta | cut-c3)"; a4="$(echo $respuesta | cut-c4)"a5="$(echo $respuesta | cut-c5)"if ["$respuesta"="$palabra"] ; entonces # ¡entendido! bien hecho echo"Lo has adivinado: $(echo $palabra | tr'[:inferior:]''[:superior:]')! Bien hecho."exit 0 elif ["$respuesta"="salir"-o"$respuesta"=""] ; luego # escape del bucle infinito echo"La palabra era $(echo $palabra | tr'[:inferior:]''[:superior:]'). Hasta la próxima". exit 0 else # evalúa la conjetura if ["$(grep-E"^$answer\$"$dict)"=""] ; entonces # 4. ¿Está la respuesta en el diccionario? Si no, no lo evalúes? echo"Tu suposición no está en mi diccionario". else # 5. evaluar y mostrar el resultado: echo"Resultado de su conjetura: \c"lettercheck"$a1"1 ; echo"$returnchar \c"lettercheck"$a2"2 ; echo"$returnchar \c"lettercheck"$a3"3 ; echo"$returnchar \c"lettercheck"$a4"4 ; echo"$returnchar \c"lettercheck"$a5"5 ; echo"$returnchar"fi fi done exit 0

Entonces, ¿qué no está del todo bien? El principal problema de funcionalidad aparece cuando tienes letras duplicadas en una palabra. Si observa detenidamente el código lettercheck, se dará cuenta de que si la palabra es, digamos, celos y supongo que mandón, ambas letras’s’se mostrarán como una letra en la palabra final. , aunque solo el primero debe ser una coincidencia. Ese error, sin embargo, lo dejaré para que usted lo resuelva, y recuerde que puede ocurrir con una letra duplicada en la conjetura o en la palabra objetivo. De lo contrario, esto debería darle una gran ventaja en la creación de Wordle para la línea de comandos de Linux. ¡Diviértete!

Consejo profesional: He estado escribiendo sobre Linux desde los albores del sistema operativo, y Unix antes de eso. Consulte mi extensa área de ayuda de Linux y el área de programación de scripts de shell de Linux para obtener una gran cantidad de contenido tutorial adicional mientras está de visita. ¡Gracias!

wordle para linux, programa wordle

By Maxwell Gaven

Ich habe 7 Jahre im IT-Bereich gearbeitet. Es macht Spaß, den stetigen Wandel im IT-Bereich zu beobachten. IT ist mein Job, Hobby und Leben.