Nous sommes The Imitation Game, une équipe composée des membres de la cohorte BNTA 4, Alex, Cristian, Suad, Rosalinda et Rachel.
Ce projet collaboratif a été réalisé dans le cadre du programme Bright Network Technology Academy. Le projet consiste en une application d'assistance Wordle, basée sur les concepts de théorie de l'information utilisés dans une vidéo YouTube de 3Blue1Brown – Solving Wordle using Information Theory .
L'API a été créée à l'aide de Java, SpringBoot et PostgresQL et testée à l'aide de Postman. La liste de tous les mots possibles a été tirée d'ici, tandis que les réponses pour Wordle de chaque jour ont été trouvées en inspectant le site Web de Wordle.
Il existe deux modes :
Les exigences de notre projet et notre calendrier de développement peuvent être consultés ici.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
et ouvrez-le dans votre IDE Java préféré (nous recommandons IntelliJ)wordle
. (Si vous utilisez le terminal, tapez psql
pour lancer PostgresQL, puis exécutez CREATE DATABASE wordle;
)worlde.sql
pour remplir vos tables de base de données wordle
. Pour ce faire, vous pouvez soit :Remarque — les commandes DROP TABLES au début du script SQL ne sont pas nécessaires si vous configurez la base de données pour la première fois (voir ci-dessous) :
DROP TABLE IF EXISTS original_word_list CASCADE;
DROP TABLE IF EXISTS users CASCADE;
DROP TABLE IF EXISTS actual_answers CASCADE;
DROP TABLE IF EXISTS all_games CASCADE;
Remarque également : Pour les commandes ci-dessous, assurez-vous de les remplacer par les chemins de fichiers corrects :
-- Insert data into original word list table
COPY original_word_list (word, probability, score) FROM
' /[insert file path here]/initialcalculations.txt ' DELIMITER ' , ' CSV;
-- Insert actual answers and respective dates data into actual answers table
COPY actual_answers (date_of_given_answer, actual_word) FROM
' /[insert file path here]/date-word-answer.txt ' DELIMITER ' , ' CSV;
localhost:8080/competitive/computemachinescores
. Notez que cette étape peut prendre un certain temps, car elle calcule les scores de la machine pour l'ensemble des ~3 000 réponses réelles ! Voir ci-dessous pour une liste des méthodes utilisées dans chaque classe et leurs descriptions :
WordService
) Cette classe de service appelle la couche d'accès aux données pour récupérer les objets Word
de la base de données. De plus, il contient également des méthodes relatives à la logique du solveur Wordle lui-même.
.GetAllWords()
Renvoie une liste de toutes les entrées de la table original_word_list en tant qu'objets Word
.
.GetAllWordsRankedByScore()
Identique à .GetAllWords
sauf que la liste des objets Word
est classée par la propriété score.
.GetAllWordsRankedByScore(Integer numOfWords)
Identique à .GetAllWordsRankedByScore
sauf que la liste des objets Word
a une taille donnée par numOfWords
.
.GetWordById(Integer id)
Récupère Word
avec id
donné de la table original_word_list.
.GetWordByName(String nameOfWord)
Récupère le premier Word
dont la propriété word
est égale à nameOfWord
de la table original_word_list.
.WordValidator(String word)
Renvoie true
si la chaîne donnée est incluse dans la colonne de mots de la table original_word_list, sinon une exception est levée.
.setUniformProbabilities(List<Word> wordList)
Renvoie la liste d'entrée des objets Word
après avoir défini la propriété de probabilité de chaque Word
sur que tous soient égaux et que la somme soit égale à l'unité. À titre d'exemple, une liste composée de deux objets Word
sera renvoyée avec des probabilités toutes deux définies sur 0.5
.
.GenerateWordPattern(Word word, Word targetWord)
Renvoie un LinkedHashMap<String, String>
représentant le modèle obtenu en devinant word
en supposant que targetWord
est la réponse. À titre d'exemple, le modèle Wordle décrit ici serait représenté par la carte :
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
En général, les clés sont désignées par la lettre suivie de l'index marquant sa position dans le mot. Les valeurs prennent trois valeurs "yellow"
, "green"
et "grey"
chacune représentant la couleur de la lettre dans le motif Wordle.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Renvoie true
si word
et targetWord
peuvent reproduire pattern
lorsqu'ils sont passés en arguments de la méthode .GenerateWordPattern
. Sinon, false
est renvoyé.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Renvoie une liste d'objets Word
constitués des mots de wordList
qui renvoient true
lorsqu'ils sont transmis comme argument targetWord
de .checkPatternMatch
. Ici, guess
et pattern
servent d’autres arguments.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Pour une guess
donnée, calculez un Double
dont la valeur représente la probabilité que le pattern
donné soit obtenu. Ceci est déterminé par la somme des probabilités de tous les objets Word
dans wordList
qui renvoient true
lorsqu'ils sont saisis comme argument targetWord
pour .checkPatternMatch
.
.logTwo(Double value)
Renvoie le Double
dont la valeur est le log de base deux de l'argument.
.computeWordScore(Word word, List<Word> wordList)
Calcule la moyenne du nombre de fois où l'on s'attend à ce que la taille wordList
soit réduite de moitié en devinant word
.
.computeScoreDistribution(List<Word> wordList)
Applique la méthode .computeWordScore
à chaque Word
de wordList
et définit la propriété score
sur la valeur renvoyée par la méthode. La liste résultante d'objets Word
est ensuite renvoyée.
getGuessesForAnswer(Answer answer)
Calcule le nombre de suppositions nécessaires au solveur Wordle pour deviner answer
. La answer
est ensuite renvoyée avec la propriété machineResult
définie sur la valeur calculée.
AnswerService
) Cette classe de service appelle la couche d'accès aux données pour récupérer et mettre à jour les objets Answer
de la base de données.
.getAllAnswers()
Renvoie une liste de toutes les entrées de la table actual_answers en tant qu'objets Answer
.
.doesAnswerWithIdExists(Integer id)
Renvoie true
si l'objet Answer avec l'identifiant existe dans la table actual_answers
.getAnswerById(Integer id)
Renvoie l'objet Answer avec l'identifiant correspondant de la table actual_answers
.addAnswerToTable(Answer answer)
Prend l'objet Answer
et l'ajoute à la table actual_answers
.deleteAnswerById(Integer id)
Supprime l'objet Answer
avec l'identifiant correspondant de la table actual_answers de l'argument
.updateAnswerById(Integer id, Answer answer)
Met à jour l'objet Answer
avec l'identifiant correspondant de la table actual_answers avec l'objet Answer
passé en argument
Dans cette section, les POJO utilisés dans le projet sont répertoriés avec leurs propriétés et la structure JSON associée lors de l'utilisation des requêtes POST et PUT :
Requête HTTP | Taper | Fonction |
---|---|---|
Mot | • ID entier • Mot de chaîne • Double probabilité • Double note | N / A |
Utilisateur | • ID entier • Nom de la chaîne • Chaîne d'e-mail • Nom d'utilisateur de chaîne | { "nom": "Suad", "email": "[email protected]", "Nom d'utilisateur": "SusuTheFlowerPot" } |
Répondre | • ID entier • LocalDate Date de réponse • Chaîne Réponse du jour • Résultats machine entiers | { "dateOfAnswer": "04/01/2025", "answerOfDay": "taille", "machineRésultat": 3 } |
Jeu | • ID entier • ID utilisateur entier • ID de réponse entier • Nombre entier d'estimations d'utilisateur | { "IDutilisateur": 1, "identifiant de réponse": 1, "utilisateurGuessed": 3 } |
Requête HTTP | Taper | Fonction |
---|---|---|
hôte local : 8080/assistant | OBTENIR | Obtenez tous les mots. |
localhost:8080/helper/classé | OBTENIR | Obtenez tous les mots classés par score. |
localhost:8080/helper/ranked/{numOfWords} | OBTENIR | Obtenez tous les mots classés par score et spécifiez le nombre de mots renvoyés. |
hôte local : 8080/helper/start | OBTENIR | Commencez le jeu. Renverra les meilleures suppositions classées par score. |
localhost:8080/helper/start/{word} | SUPPRIMER | Saisissez votre estimation pour {word} et incluez le modèle que vous avez obtenu de Wordle dans le corps de la demande au format JSON (c'est-à-dire quelles lettres étaient vertes, jaunes, grises). Exemple: { "f0": "jaune", "o1": "jaune", "o2": "vert", "d3": "gris", "s4": "vert" } |
localhost:8080/helper/endgame | SUPPRIMER | Termine le jeu lorsque vous avez trouvé le bon mot. |
Requête HTTP | Taper | Fonction |
---|---|---|
localhost:8080/helper/wordbyid/{id} | OBTENIR | Obtenez un identifiant mot par mot. |
localhost:8080/helper/wordbyname/{nameofword} | OBTENIR | Obtenez mot par mot. |
Requête HTTP | Taper | Fonction |
---|---|---|
localhost : 8080/compétitif/computemachinescores | METTRE | Nécessaire pour fonctionner dans le cadre de la configuration du mode compétitif. Cela remplira les suppositions de la machine dans le tableau actual_answers. |
localhost : 8080/compétitif/tous | OBTENIR | Obtenez tous les jeux dans la base de données. |
localhost:8080/compétitif/addgame | POSTE | Ajoutez un nouveau jeu (JSON) à la base de données à l'aide de Request Body. Exemple: { "IDutilisateur": 1, "identifiant de réponse": 1, "utilisateurGuessed": 3 } |
localhost:8080/competitive/dailyresults/{date} | OBTENIR | Obtenez tous les résultats à une date donnée. |
localhost : 8080/competitive/userresults/{username}/{date} | OBTENIR | Obtenez tous les résultats pour le nom d'utilisateur donné à la date. |
localhost:8080/competitive/userresults/{username} | OBTENIR | Obtenez tous les résultats pour le nom d'utilisateur. |
localhost:8080/competitive/averageresults/{username} | OBTENIR | Obtenez la moyenne des suppositions d'un utilisateur. |
localhost : 8080/competitive/start/{userId} | OBTENIR | Démarrez un jeu pour un utilisateur avec l'identifiant correspondant. |
localhost : 8080/competitive/start/{userid}/{guess} | SUPPRIMER | Saisissez la réponse de l'utilisateur dans {guess}. Répétez pour chaque supposition jusqu'à ce que le jeu soit terminé. |
localhost : 8080/competitive/start/{userid}/end | POSTE | Terminez le jeu pour l'utilisateur et enregistrez le résultat dans la base de données. |
hôte local : 8080/utilisateur | OBTENIR | Obtenez tous les utilisateurs de la base de données. |
hôte local :8080/user/{userId} | OBTENIR | Récupère l'utilisateur de la base de données par identifiant. |
hôte local : 8080/utilisateur | POSTE | Ajoutez un utilisateur (JSON) à la base de données à l'aide du corps de la requête. Exemple: { "nom": "Suad", "email": "[email protected]", "Nom d'utilisateur": "SusuTheFlowerPot" } |
Requête HTTP | Taper | Fonction |
---|---|---|
localhost :8080/competitive/{id} | METTRE | Mettez à jour le jeu (JSON) par identifiant via Request Body. Exemple: { "IDutilisateur": 1, "identifiant de réponse": 1, "utilisateurGuessed": 3 } |
localhost :8080/competitive/{id} | SUPPRIMER | Supprimer le jeu par identifiant. |
localhost :8080/competitive/{id} | OBTENIR | Obtenez le jeu par identifiant. |
hôte local : 8080/réponses | OBTENIR | Obtenez toutes les réponses. |
hôte local : 8080/réponses/{id} | OBTENIR | Obtenez une réponse par identifiant de réponse. |
hôte local :8080/réponses/addanswer | POSTE | Ajoutez une réponse (JSON) à l’aide du corps de la demande. Exemple: { "dateOfAnswer": "04/01/2025", "answerOfDay": "taille", "machineRésultat": 3 } |
hôte local : 8080/réponses/{id} | SUPPRIMER | Supprimer la réponse par identifiant. |
localhost:8080/answers/update/{id} | METTRE | Mettez à jour la réponse (JSON) par identifiant à l’aide du corps de la demande. Exemple: { "dateOfAnswer": "04/01/2025", "answerOfDay": "taille", "machineRésultat": 3 } |
hôte local :8080/user/{userId} | SUPPRIMER | Supprimer l'utilisateur par identifiant. |
hôte local :8080/user/{userId} | METTRE | Mettez à jour l'utilisateur (JSON) par identifiant à l'aide du corps de la demande. Exemple: { "nom": "Suad", "email": "[email protected]", "Nom d'utilisateur": "SusuTheFlowerPot" } |
Un immense merci à l'équipe du BNTA, et tout particulièrement à nos formateurs, Colin, Nelson et Iain !