J’ai regardé l’application Wordle et il me semble qu’elle est sacrément facile à dupliquer. J’apprends moi-même la programmation de scripts shell, alors je me demande s’il existe un moyen de créer un wordle pour la ligne de commande sous Linux ?
Il y a beaucoup de choses sur Wordle qui étaient vraiment intelligentes dès la première version, et non des moindres dont est qu’il est simple à saisir et difficile à maîtriser. Puisqu’il n’a qu’un seul puzzle de mots par jour, c’est aussi un jeu décontracté parfait pour un appareil mobile sur le chemin de l’école, du travail, même allongé dans son lit, se réveillant lentement. Six suppositions. Cinq lettres. Il montre si vous devinez une lettre dans le bon emplacement, une lettre qui est dans le mot mais pas le premier emplacement, et toutes les lettres dans votre supposition qui manquent dans le mot.
L’autre facette qui a vraiment fonctionné bien est qu’il est vraiment facile de partager vos résultats avec des amis sur les réseaux sociaux. Bien sûr, les amis qui ne jouent pas à Wordle ne seront pas intéressés, mais bon, ceux qui le font peuvent facilement comparer leur nombre de suppositions avec le vôtre, et ce sont les jours où vous obtenez le mot en quelques suppositions ! Puisqu’il n’y a aucun indice, c’est vraiment difficile car il y a des milliers et des milliers de mots de 5 lettres dans le dictionnaire anglais.
Pourtant, si vous pouvez le coder, vous pouvez également le coder en tant que script shell, même si ce n’est peut-être pas le plus efficace ou le plus élégant (en particulier par rapport au simple et efficace conception de l’application mobile). Creusons et voyons comment recréer Wordle en tant que script shell Linux et MacOS.
ÉTAPE 1 : CHOISISSEZ UN MOT DANS LE DICTIONNAIRE
Diverses distributions de Linux incluent des dictionnaires, mais ils inclure des centaines de mots assez obscurs qui n’apparaissent même pas dans les dictionnaires de langue anglaise standard. Le jeu n’est pas amusant s’il demande des mots dont vous n’avez jamais entendu parler, n’est-ce pas ? Heureusement, le Web arrive et il y a un joli fichier texte d’environ 5 000 mots anglais de 5 lettres que vous pouvez récupérer directement sur le net à
https://www-cs-faculty.stanford.edu/~knuth/sgb-words.txt
Prenez-le et enregistrez-le sous”5-letter-mots.txt ». Définissez ensuite une variable afin que nous puissions l’appeler”dict”à l’avenir :
dict=”5-letter-words.txt”.
Passons maintenant au premier élément de codage intéressant : choisir un mot aléatoire d’un fichier texte. Cela peut être fait en calculant le nombre de lignes dans le fichier, puis en utilisant la variable intégrée $RANDOM dans le shell pour générer un entier aléatoire 2**32, modifié pour être compris entre 0 et le nombre de lignes-1:
# 1. Choisissez un mot dans la liste lines=”$(wc-l <$dict)"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"
J’espère que tout est clair pour vous, en utilisant $randomchoice pour se souvenir de la ligne que nous voulons, puis head|tail pour extraire cette ligne du dictionnaire. Le résultat est que $word est le mot à deviner.
Maintenant, tant que nous l’avons, divisons-le en cinq variables d’une lettre. Il existe de nombreuses façons de le faire, mais j’utiliserai une simple coupe dans une approche de sous-shell :
w1=”$(echo $word | cut-c1)” ; w2=”$(echo $mot | coupe-c2)”w3=”$(echo $mot | coupe-c3)”; w4=”$(echo $word | cut-c4)”w5=”$(echo $word | cut-c5)”
La première étape est terminée. $word contient le mot à deviner et $w1 à $w5 contiennent les cinq lettres qui composent ce mot.
ÉTAPE 2 : INVITEZ L’UTILISATEUR À DEVISER
La deuxième étape consiste à créer une boucle et à l’intérieur de celle-ci invitent l’utilisateur à deviner. Facile à faire:
jusqu’à [ 0-eq 1 ] ; do echo”\nGuess : \c”read answer plus de code ira ici done
Le reste de notre code (à l’exception d’une fonction qui apparaîtra dans un instant) sera caché après’read answer’mais avant’fait’. Pendant que nous traitons la supposition, décomposons-la également en cinq variables séquentielles :
a1=”$(echo $answer | cut-c1)” ; a2=”$(echo $réponse | coupe-c2)”a3=”$(echo $réponse | coupe-c3)”; a4=”$(echo $answer | cut-c4)”a5=”$(echo $answer | cut-c5)”
Vous pouvez toujours trancher une variable avec une notation ${varname:x:y}, mais Je préfère des variables séparées pour plus de clarté.
ÉTAPE 3 : VÉRIFIER LA DEVISE PAR RAPPORT AU DICTIONNAIRE
Puisque l’une des règles de Wordle est que votre proposition doit être un mot anglais correct, nous aurons besoin pour vérifier ça aussi. Il s’avère que c’est sacrément facile…
if [“$(grep-E”^$answer\$”$dict)”=””] ; then # La réponse est-elle dans le dictionnaire ? Si non, ne l’évaluez-vous pas ? echo”Votre supposition n’est pas dans mon dictionnaire.”else
J’ai formaté ceci comme un conditionnel parce que c’est l’un des nombreux tests que nous appliquerons…
ÉTAPE 4 : COMPARER CHAQUE LETTRE CONTRE LA CIBLE
L’étape suivante , et de loin la plus compliquée, consiste à tester chaque lettre de l’utilisateur par rapport non seulement à la même case de lettre dans le mot cible, mais à toutes les lettres du mot. Pour ce faire, je vais créer une fonction shell :
lettercheck() { # answer-letter lettercount # toutes les lettres de réponse sont déjà dans w1 w2 etc # renvoie la valeur dans”$returnchar”if [“$1″=”$(eval echo \$w$2)”] ; puis # lettre devinée au bon endroit ! returnchar=”$(echo $1 | tr”[:lower:]””[:upper:]”)”elif [“$(echo $word | grep”$1″)”!=””] ; then # lettre présente, mauvais endroit (nécessite un raffinement) returnchar=”$1″else # lettre non présente dans le mot returnchar=”-“fi }
Puisque vous pouvez passer des variables aux fonctions dans le shell, il sera invoqué avec le premier paramètre la lettre devinée et le deuxième paramètre la fente ordinale (en d’autres termes, si je devinais”carom”alors la lettre 3 serait”r”et ce serait la lettre #3 dans ma conjecture.
Comme je ne peux pas changer la couleur des lettres devinées, j’utilise plutôt la notation selon laquelle faire écho à la supposition avec une lettre translittérée en majuscule signifie que c’est la bonne lettre au bon endroit, si c’est en minuscule alors c’est la bonne lettre dans le mauvais endroit, et si c’est juste un”-“, c’est une lettre qui n’est pas présente. Pouvez-vous voir comment tout cela apparaît dans le code ci-dessus ?
ÉTAPE 5 : ÉVALUER GUESS AVEC LETTERCHECK
Avec la fonction écrite, il est temps de l’utiliser, et voici comment je procède :
echo”Résultat de votre estimation : \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”
Je profite de la notation \c dans echo pour qu’il n’inclue pas de retour chariot, ce qui permet au script de créer une ligne de sortie lettre par lettre. Pratique !
TOUT ENSEMBLE
Avant de vous montrer tout le code avec des boucles, jetons un coup d’œil à la sortie, une petite partie de SHWORDLE :
$ sh shwordle.sh Supposition : oiseaux Résultat de votre supposition :—-S Supposition : carpes Résultat de votre supposition :-a–S Devinez: reels Résultat de votre devinette:-E e L S Devinez: zèles Vous l’avez deviné: ZEALS ! Bien joué.
J’ai triché parce que je connaissais le mot à l’avance, mais vous pouvez voir que c’est difficile, mais quand vous vous souvenez que majuscule signifie bonne lettre, bon emplacement, et minuscule signifie bonne lettre, mauvais emplacement, cela fonctionne parfaitement. Eh bien, pas tout à fait, mais j’y reviendrai.
Pour l’instant, voici le script complet, ligne par ligne, y compris les commentaires :
#!/bin/sh # SHWORDLE-duplique la fonctionnalité du jeu de devinettes Wordle # écrit par Dave Taylor. Il reste encore quelques bugs à corriger. dict=”/Users/taylor/bin/5-letter-words.txt”lettercheck() { # answer-letter lettercount # toutes les lettres de réponse sont déjà dans w1 w2 etc # renvoie la valeur dans”$returnchar”if [“$1″=”$(eval echo \$w$2)”] ; puis # lettre devinée au bon endroit ! returnchar=”$(echo $1 | tr”[:lower:]””[:upper:]”)”elif [“$(echo $word | grep”$1″)”!=””] ; then # lettre présente, mauvais endroit (à préciser) returnchar=”$1″else # lettre absente du mot returnchar=”-“fi } # 1. Choisissez un mot dans la liste lines=”$(wc-l <$dict )"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"w1="$(echo $word | cut-c1)" ; w2="$(echo $mot | coupe-c2)"w3="$(echo $mot | coupe-c3)"; w4="$(echo $word | cut-c4)"w5="$(echo $word | cut-c5)"# voici une astuce : echo"--$word--$w1 $w2 $w3 $w4 $ w5"# 2. Boucle pour demander à l'utilisateur de deviner. jusqu'à [ 0-eq 1 ] ; do echo"\nGuess: \c"read answer # 3. décomposer le mot deviné en lettres a1="$(echo $answer | cut-c1)"; a2="$(echo $réponse | coupe-c2)"a3="$(echo $réponse | coupe-c3)"; a4="$(echo $réponse | coupe-c4)"a5="$(echo $réponse | coupe-c5)"if ["$réponse"="$mot"] ; alors # j'ai compris ! bravo echo"Vous l'avez deviné : $(echo $word | tr'[:lower:]''[:upper:]') ! Bravo."exit 0 elif ["$réponse"="quit"-o"$réponse"=""] ; then # échappe à la boucle infinie echo"Le mot était $(echo $word | tr'[:lower:]''[:upper:]'). A la prochaine fois."exit 0 else # évaluer la supposition if ["$(grep-E"^$answer\$"$dict)"=""] ; puis # 4. La réponse est-elle dans le dictionnaire ? Si non, ne l'évaluez-vous pas ? echo"Votre supposition n'est pas dans mon dictionnaire."else # 5. évaluer et afficher le résultat: echo"Résultat de votre estimation: \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
Alors qu’est-ce qui ne va pas ? Le principal problème de fonctionnalité apparaît lorsque vous avez des lettres en double dans un mot. Si vous regardez attentivement le code lettercheck, vous vous rendrez compte que si le mot est, disons, zèle et je suppose autoritaire, les deux lettres’s’apparaîtront comme correspondant à une lettre dans le dernier mot , même si seul le premier doit correspondre. Ce bogue, cependant, je vous laisse le soin de le résoudre, et rappelez-vous que cela peut arriver avec une lettre en double dans la supposition ou dans le mot cible. Sinon, cela devrait vous donner une grande longueur d’avance dans la création de Wordle pour la ligne de commande Linux. Amusez-vous !
Conseil de pro : j’écris sur Linux depuis l’aube du système d’exploitation, et sur Unix avant cela. Veuillez consulter ma zone d’aide Linux étendue et ma zone de programmation de scripts shell Linux pour de nombreux contenus de didacticiel supplémentaires pendant votre visite. Merci !
wordle pour linux, programme wordle