URL: https://linuxfr.org/users/steph1978/journaux/sur-le-fonctionnement-du-jeu-wordle Title: sur le fonctionnement du jeu Wordle Authors: steph1978 Date: 2022年01月13日T11:39:37+01:00 License: CC By-SA Tags: rétro-ingénierie, jeu, puzzle, javascript, wordle et firefox Score: 27 J'ai croisé [le jeu wordle](https://www.powerlanguage.co.uk/wordle/) dans plusieurs articles récents lors de [ma veille](https://www.zoocoop.com/contentoob/lobsters.atom). C'est un peu comme un [mastermind](https://fr.wikipedia.org/wiki/Mastermind) mais avec des mots du dictionnaire. Il y a un mot par jour à deviner, de cinq lettres. Le mot d'hier était 'favor'. Vous proposez un mot du dictionnaire (lequel ?), le jeu vous dit quelles lettres sont dans le mot à trouver et quelles lettres sont à la bonne place, quelles lettres n'y sont pas. J'ai joué mais je ne suis pas doué. Je connais combien de mots de cinq lettres en anglais ... Par contre mon pc connaît plus de 15k mots d'anglais de cinq lettres, oui oui. Et il est capable de valider ces mots par une liste de règles (contient un "a", a un "e" à telle position, ne contient pas de "p", ...). J'ai pu trouver 'favor' en quatre essais à coup de `grep` et `grep -v`. C'est donc un travail pour un ordinateur. Je cherche tout d'abord à comprendre comment marche le jeu. Je lance le lien avec les outils de dev Firefox ouverts (`F12`). Je m'attends à des aller-retours avec le serveur pour valider les propositions de mots. Mais rien, tout est côté client ! Et quand c'est côté client, on regarde le source (`CTRL+U`). Il y a un gros script de 177kB, très obfusqué, clairement passé dans la moulinette d'un builder JS. Je l'ouvre dans [cudatext](https://cudatext.github.io/). Je browse un peu et vois rapidement une liste de mots de cinq lettres (le dictionnaire) ... et juste après une autre liste de mots de cinq lettre (?). ![obfuscated](http://www.zoocoop.com/wordle/wordle_obfuscated.png) J'extrais les deux listes et compte les mots : 2315 dans la première, 10657 dans la seconde, pas loin de mes 15k. À leur tête, je comprends que la première liste sont des mots courants, qui seront proposé à la devinette et que la deuxième est une liste de mots autorisés car dans le dictionnaire anglais mais beaucoup moins courant donc moins drôle à jouer. En résumé, le jeu prends chaque jour un mot dans la première liste et valide les propositions du joueur sur l'union des deux listes. Je suis assez curieux de savoir comment est choisi le mot du jour. Dans le javascript, je supprime la quasi totalité les mots des listes. Reste 77kB quand même. Je cherche [format javascript](https://searx.tiekoetter.com/search?q=format+javascript) sur le web et tombe sur [un outil](https://beautifier.io/) qui accepte de me reformater le script. Je remets ça dans cudatext, cherche un mot que j'ai laissé. ![clear](http://www.zoocoop.com/wordle/wordle_clear.png) Je vois que la liste (`La`) est utilisée dans une fonction (`Na`) un peu plus bas. J'instrumente à coup de `console.log` et je remets ça dans la source HTML. Miracle ou presque le script reformaté fonctionne parfaitement et mes traces apparaissent. L'algo est des plus simple : date du jour - date de début du jeu, en jours => index du mot dans la première liste. La liste n'étant pas triée, cela donne un mot "aléatoire". Pour preuve, le mot d'aujourd'hui : ![13jan](http://www.zoocoop.com/wordle/wordle_13jan.png) Promis je ne vous spoile pas le reste. Exercice laissé au lecteur ou à moi même : implémenter le jeu en client-serveur afin de ne pas divulguer la liste et pourvoir tenir un leaderborad (et blinder le truc de pubs et de cryptominers pour faire des bouzoufs).

AltStyle によって変換されたページ (->オリジナル) /