Wir sind The Imitation Game, ein Team bestehend aus den Mitgliedern der BNTA-Kohorte 4: Alex, Cristian, Suad, Rosalinda und Rachel.
Dieses Gemeinschaftsprojekt wurde im Rahmen des Bright Network Technology Academy-Programms abgeschlossen. Das Projekt besteht aus einer Wordle-Hilfsanwendung, die auf den Konzepten der Informationstheorie basiert, die in einem YouTube-Video von 3Blue1Brown – Solving Wordle using Information Theory verwendet werden.
Die API wurde mit Java, SpringBoot und PostgresQL erstellt und mit Postman getestet. Die Liste aller möglichen Wörter stammt von hier, während die Antworten für jeden Tag auf der Wordle-Website gefunden wurden.
Es gibt zwei Modi:
Unsere Projektanforderungen und den Entwicklungsplan finden Sie hier.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
und öffnen Sie es in Ihrer bevorzugten Java-IDE (wir empfehlen IntelliJ).wordle
. (Wenn Sie das Terminal verwenden, geben Sie psql
ein, um PostgresQL zu starten, und führen Sie dann CREATE DATABASE wordle;
aus.)worlde.sql
um Ihre wordle
-Datenbanktabellen zu füllen. Dazu können Sie entweder:Hinweis : Die DROP TABLES-Befehle am Anfang des SQL-Skripts sind nicht erforderlich, wenn Sie die Datenbank zum ersten Mal einrichten (siehe unten):
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;
Beachten Sie außerdem : Stellen Sie sicher, dass Sie die folgenden Befehle durch die richtigen Dateipfade ersetzen:
-- 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
. Beachten Sie, dass dieser Schritt einige Zeit in Anspruch nehmen kann, da die maschinellen Ergebnisse für alle ca. 3.000 tatsächlichen Antworten berechnet werden! Unten finden Sie eine Liste der in jeder Klasse verwendeten Methoden und ihre Beschreibungen:
WordService
) Diese Dienstklasse ruft die Datenzugriffsschicht auf, um Word
Objekte aus der Datenbank abzurufen. Darüber hinaus enthält es auch Methoden, die sich auf die Logik des Wordle-Lösers selbst beziehen.
.GetAllWords()
Gibt eine Liste aller Einträge in der Tabelle original_word_list als Word
-Objekte zurück.
.GetAllWordsRankedByScore()
Identisch mit .GetAllWords
außer dass die Liste der Word
-Objekte nach der Eigenschaft „score“ geordnet wird.
.GetAllWordsRankedByScore(Integer numOfWords)
Identisch mit .GetAllWordsRankedByScore
außer dass die Liste der Word
-Objekte eine durch numOfWords
angegebene Größe hat.
.GetWordById(Integer id)
Ruft Word
mit der angegebenen id
aus der Tabelle original_word_list ab.
.GetWordByName(String nameOfWord)
Ruft das erste Word
, dessen word
gleich nameOfWord
ist, aus der Tabelle original_word_list ab.
.WordValidator(String word)
Gibt true
zurück, wenn die angegebene Zeichenfolge in der Wortspalte der Tabelle „original_word_list“ enthalten ist, andernfalls wird eine Ausnahme ausgelöst.
.setUniformProbabilities(List<Word> wordList)
Gibt eine Eingabeliste von Word
-Objekten zurück, nachdem die Wahrscheinlichkeitseigenschaft jedes Word
so eingestellt wurde, dass alle gleich sind und die Summe eins ergibt. Als Beispiel wird eine Liste bestehend aus zwei Word
-Objekten zurückgegeben, wobei die Wahrscheinlichkeiten für beide auf 0.5
festgelegt sind.
.GenerateWordPattern(Word word, Word targetWord)
Gibt eine LinkedHashMap<String, String>
zurück, die das Muster darstellt, das durch das Erraten word
erhalten wird, vorausgesetzt, dass targetWord
die Antwort ist. Als Beispiel würde das hier dargestellte Wordle-Muster durch die Karte dargestellt:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
Im Allgemeinen werden Schlüssel mit dem Buchstaben gefolgt vom Index bezeichnet, der ihre Position im Wort markiert. Die Werte nehmen drei Werte an: "yellow"
, "green"
und "grey"
die jeweils die Farbe des Buchstabens im Wordle-Muster darstellen.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Gibt true
zurück, wenn word
und targetWord
pattern
reproduzieren können, wenn sie als Argumente der .GenerateWordPattern
-Methode übergeben werden. Andernfalls wird false
zurückgegeben.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Gibt eine Liste von Word
-Objekten zurück, die aus den Wörtern in wordList
bestehen, die true
zurückgeben, wenn sie als targetWord
-Argument von .checkPatternMatch
übergeben werden. Hier dienen guess
und pattern
als weitere Argumente.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Berechnen Sie für eine gegebene guess
ein Double
, dessen Wert die Wahrscheinlichkeit darstellt, mit der das gegebene pattern
erhalten wird. Dies wird durch die Summe der Wahrscheinlichkeiten aller Word
Objekte in wordList
bestimmt, die true
zurückgeben, wenn sie als targetWord
-Argument für .checkPatternMatch
eingegeben werden.
.logTwo(Double value)
Gibt das Double
zurück, dessen Wert die Logbasis zwei des Arguments ist.
.computeWordScore(Word word, List<Word> wordList)
Berechnet den Durchschnitt, wie oft man erwartet, dass sich die Größe wordList
durch Erraten word
halbiert.
.computeScoreDistribution(List<Word> wordList)
Wendet die .computeWordScore
Methode auf jedes Word
in wordList
an und legt die Eigenschaft score
auf den von der Methode zurückgegebenen Wert fest. Die resultierende Liste von Word
-Objekten wird dann zurückgegeben.
getGuessesForAnswer(Answer answer)
Berechnet die Anzahl der Vermutungen, die der Wordle-Löser benötigt, um answer
zu erraten. Die answer
wird dann zurückgegeben, wobei die Eigenschaft machineResult
auf den berechneten Wert gesetzt ist.
AnswerService
) Diese Serviceklasse ruft die Datenzugriffsschicht auf, um Answer
aus der Datenbank abzurufen und zu aktualisieren.
.getAllAnswers()
Gibt eine Liste aller Einträge in der Tabelle „actual_answers“ als Answer
zurück.
.doesAnswerWithIdExists(Integer id)
Gibt true
zurück, wenn das Antwortobjekt mit der ID in der Tabelle „actual_answers“ vorhanden ist
.getAnswerById(Integer id)
Gibt ein Antwortobjekt mit der entsprechenden ID aus der Tabelle „actual_answers“ zurück
.addAnswerToTable(Answer answer)
Nimmt das Answer
und fügt es der Tabelle „actual_answers“ hinzu
.deleteAnswerById(Integer id)
Löscht Answer
mit der entsprechenden ID aus der Tabelle „actual_answers“ aus dem Argument
.updateAnswerById(Integer id, Answer answer)
Aktualisiert das Answer
mit der entsprechenden ID aus der Tabelle „actual_answers“ mit dem als Argument übergebenen Answer
In diesem Abschnitt werden die im Projekt verwendeten POJOs zusammen mit ihren Eigenschaften und der zugehörigen JSON-Struktur bei Verwendung von POST- und PUT-Anfragen aufgelistet:
HTTP-Anfrage | Typ | Funktion |
---|---|---|
Wort | • Ganzzahlige ID • String-Wort • Doppelte Wahrscheinlichkeit • Doppelte Punktzahl | N / A |
Benutzer | • Ganzzahlige ID • String-Name • String-E-Mail • String-Benutzername | { „name“: „Suad“, „E-Mail“: „[email protected]“, „userName“: „SusuTheFlowerPot“ } |
Antwort | • Ganzzahlige ID • LocalDate DateOfAnswer • String AnswerOfDay • Ganzzahlige Maschinenergebnisse | { „dateOfAnswer“: „2025-01-04“, „answerOfDay“: „Taille“, „machineResult“: 3 } |
Spiel | • Ganzzahlige ID • Ganzzahlige Benutzer-ID • Ganzzahlige Antwort-ID • Ganzzahlige UserGuesses | { „Benutzer-ID“: 1, „answerId“: 1, „userGuessed“: 3 } |
HTTP-Anfrage | Typ | Funktion |
---|---|---|
localhost:8080/helper | ERHALTEN | Holen Sie sich alle Wörter. |
localhost:8080/helper/ranked | ERHALTEN | Lassen Sie alle Wörter nach Punktzahl ordnen. |
localhost:8080/helper/ranked/{numOfWords} | ERHALTEN | Lassen Sie alle Wörter nach Punktzahl ordnen und geben Sie an, wie viele Wörter zurückgegeben werden. |
localhost:8080/helper/start | ERHALTEN | Starten Sie das Spiel. Gibt die besten Schätzungen sortiert nach Punktzahl zurück. |
localhost:8080/helper/start/{word} | LÖSCHEN | Geben Sie Ihre Schätzung für {word} ein und fügen Sie das Muster, das Sie von Wordle erhalten haben, als JSON in den Anfragetext ein (d. h. welche Buchstaben grün, gelb und grau waren). Beispiel: { „f0“: „gelb“, „o1“: „gelb“, „o2“: „grün“, „d3“: „grau“, „s4“: „grün“ } |
localhost:8080/helper/endgame | LÖSCHEN | Beendet das Spiel, wenn Sie das richtige Wort haben. |
HTTP-Anfrage | Typ | Funktion |
---|---|---|
localhost:8080/helper/wordbyid/{id} | ERHALTEN | Erhalten Sie Wort für Wort die ID. |
localhost:8080/helper/wordbyname/{nameofword} | ERHALTEN | Erhalten Sie Wort für Wort den Namen. |
HTTP-Anfrage | Typ | Funktion |
---|---|---|
localhost:8080/competitive/computemachinescores | SETZEN | Erforderlich, um im Rahmen der Einrichtung des Wettbewerbsmodus ausgeführt zu werden. Dadurch werden maschinelle Schätzungen in die Tabelle „actual_answers“ eingetragen. |
localhost:8080/competitive/all | ERHALTEN | Holen Sie sich alle Spiele in die Datenbank. |
localhost:8080/competitive/addgame | POST | Fügen Sie mithilfe des Anforderungstexts ein neues Spiel (JSON) zur Datenbank hinzu. Beispiel: { „Benutzer-ID“: 1, „answerId“: 1, „userGuessed“: 3 } |
localhost:8080/competitive/dailyresults/{date} | ERHALTEN | Erhalten Sie alle Ergebnisse zum angegebenen Datum. |
localhost:8080/competitive/userresults/{Benutzername}/{Datum} | ERHALTEN | Erhalten Sie alle Ergebnisse für den vom Benutzernamen angegebenen Datum. |
localhost:8080/competitive/userresults/{Benutzername} | ERHALTEN | Alle Ergebnisse für Benutzernamen abrufen. |
localhost:8080/competitive/averageresults/{username} | ERHALTEN | Ermitteln Sie den Durchschnitt der Vermutungen eines Benutzers. |
localhost:8080/competitive/start/{userId} | ERHALTEN | Starten Sie ein Spiel für einen Benutzer mit passender ID. |
localhost:8080/competitive/start/{userid}/{guess} | LÖSCHEN | Geben Sie die Vermutung des Benutzers in {guess} ein. Wiederholen Sie dies für jede Vermutung, bis das Spiel beendet ist. |
localhost:8080/competitive/start/{userid}/end | POST | Spiel für Benutzer beenden und Ergebnis in der Datenbank speichern. |
localhost:8080/Benutzer | ERHALTEN | Holen Sie sich alle Benutzer aus der Datenbank. |
localhost:8080/user/{userId} | ERHALTEN | Benutzer anhand der ID aus der Datenbank abrufen. |
localhost:8080/Benutzer | POST | Fügen Sie mithilfe des Anforderungstexts einen Benutzer (JSON) zur Datenbank hinzu. Beispiel: { „name“: „Suad“, „E-Mail“: „[email protected]“, „userName“: „SusuTheFlowerPot“ } |
HTTP-Anfrage | Typ | Funktion |
---|---|---|
localhost:8080/competitive/{id} | SETZEN | Aktualisieren Sie das Spiel (JSON) anhand der ID über den Anforderungstext. Beispiel: { „Benutzer-ID“: 1, „answerId“: 1, „userGuessed“: 3 } |
localhost:8080/competitive/{id} | LÖSCHEN | Spiel nach ID löschen. |
localhost:8080/competitive/{id} | ERHALTEN | Holen Sie sich das Spiel per ID. |
localhost:8080/answers | ERHALTEN | Erhalten Sie alle Antworten. |
localhost:8080/answers/{id} | ERHALTEN | Erhalten Sie eine Antwort anhand der Antwort-ID. |
localhost:8080/answers/addanswer | POST | Fügen Sie mithilfe des Anforderungstexts eine Antwort (JSON) hinzu. Beispiel: { „dateOfAnswer“: „2025-01-04“, „answerOfDay“: „Taille“, „machineResult“: 3 } |
localhost:8080/answers/{id} | LÖSCHEN | Antwort nach ID löschen. |
localhost:8080/answers/update/{id} | SETZEN | Aktualisieren Sie die Antwort (JSON) anhand der ID mithilfe des Anforderungstexts. Beispiel: { „dateOfAnswer“: „2025-01-04“, „answerOfDay“: „Taille“, „machineResult“: 3 } |
localhost:8080/user/{userId} | LÖSCHEN | Benutzer nach ID löschen. |
localhost:8080/user/{userId} | SETZEN | Aktualisieren Sie den Benutzer (JSON) anhand der ID mithilfe des Anforderungstexts. Beispiel: { „name“: „Suad“, „E-Mail“: „[email protected]“, „userName“: „SusuTheFlowerPot“ } |
Ein großes Dankeschön an das BNTA-Team und insbesondere an unsere Trainer Colin, Nelson und Iain!