私たちは、BNTA Cohort 4 メンバー、Alex、Cristian、Suad、Rosalinda、Rachel で構成されるチーム、The Imitation Game です。
この共同プロジェクトは、Bright Network Technology Academy プログラムの一環として完了しました。このプロジェクトは、3Blue1Brown による YouTube ビデオ「情報理論を使用した Wordle の解決」で利用されている情報理論の概念に基づいた Wordle ヘルパー アプリケーションで構成されています。
API は Java、SpringBoot、PostgresQL を使用して作成され、Postman を使用してテストされました。考えられるすべての単語のリストはここから取得され、毎日の Wordle の答えは Wordle Web サイトを調べることで見つかりました。
次の 2 つのモードがあります。
プロジェクトの要件と開発スケジュールはここでご覧いただけます。
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
およびお気に入りの Java IDE (IntelliJ をお勧めします) で開きます。wordle
という名前の新しい PostgresQL データベースを作成します。 (ターミナルを使用している場合は、 psql
と入力して PostgresQL を起動し、 CREATE DATABASE wordle;
を実行します。)worlde.sql
スクリプトを使用して、 wordle
データベース テーブルにデータを設定します。これを行うには、次のいずれかを実行できます。注- 初めてデータベースをセットアップする場合、SQL スクリプトの先頭にある DROP TABLES コマンドは必要ありません (以下を参照)。
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;
また、次の点にも注意してください— 以下のコマンドについては、必ず正しいファイル パスに置き換えてください。
-- 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
。この段階では、約 3,000 件の実際の回答すべてのマシン スコアが計算されるため、時間がかかる場合があることに注意してください。 各クラスで使用されるメソッドのリストとその説明については、以下を参照してください。
WordService
)このサービス クラスは、データ アクセス層を呼び出して、データベースからWord
オブジェクトを取得します。さらに、Wordle ソルバー自体のロジックに関連するメソッドも含まれています。
.GetAllWords()
original_word_list テーブル内のすべてのエントリのリストをWord
オブジェクトとして返します。
.GetAllWordsRankedByScore()
Word
オブジェクトのリストがスコア プロパティによってランク付けされる点を除き、 .GetAllWords
と同じです。
.GetAllWordsRankedByScore(Integer numOfWords)
Word
オブジェクトのリストのサイズがnumOfWords
で指定されることを除いて、 .GetAllWordsRankedByScore
と同じです。
.GetWordById(Integer id)
指定されたid
を持つWord
original_word_list テーブルから取得します。
.GetWordByName(String nameOfWord)
word
プロパティがnameOfWord
と等しい最初のWord
original_word_list テーブルから取得します。
.WordValidator(String word)
指定された文字列がoriginal_word_list テーブルの word 列に含まれている場合はtrue
を返し、それ以外の場合は例外がスローされます。
.setUniformProbabilities(List<Word> wordList)
各Word
の確率プロパティをすべて等しいように設定し、合計を 1 に設定した後、 Word
オブジェクトの入力リストを返します。例として、2 つのWord
オブジェクトで構成されるリストは、両方の確率が0.5
に設定されて返されます。
.GenerateWordPattern(Word word, Word targetWord)
targetWord
答えであると仮定してword
推測することによって得られたパターンを表すLinkedHashMap<String, String>
を返します。 例として、ここに示されている Wordle パターンはマップで表されます。
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
一般に、キーは文字の後に単語内での位置を示すインデックスが続いて表されます。値は"yellow"
、 "green"
、 "grey"
の 3 つの値をとり、それぞれ Wordle パターン内の文字の色を表します。
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
.GenerateWordPattern
メソッドの引数として渡されたときにword
とtargetWord
pattern
を再現できる場合はtrue
を返します。それ以外の場合はfalse
が返されます。
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
.checkPatternMatch
のtargetWord
引数として渡された場合にtrue
を返すwordList
内の単語で構成されるWord
オブジェクトのリストを返します。ここでは、 guess
とpattern
他の引数として機能します。
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
指定されたguess
について、指定されたpattern
が取得される確率を表すDouble
計算します。これは、 .checkPatternMatch
のtargetWord
引数として入力されたときにtrue
を返すwordList
内のすべてのWord
オブジェクトの確率の合計によって決定されます。
.logTwo(Double value)
値が引数の 2 を底とする対数であるDouble
を返します。
.computeWordScore(Word word, List<Word> wordList)
word
推測することによって、 wordList
サイズが半分になると予想される回数の平均を計算します。
.computeScoreDistribution(List<Word> wordList)
.computeWordScore
メソッドをwordList
内の各Word
に適用し、 score
プロパティをメソッドによって返された値に設定します。 Word
オブジェクトの結果のリストが返されます。
getGuessesForAnswer(Answer answer)
Wordle ソルバーがanswer
を推測するために必要な推測の数を計算します。次に、 machineResult
プロパティを計算値に設定してanswer
が返されます。
AnswerService
)このサービス クラスは、データ アクセス層を呼び出して、データベースからAnswer
オブジェクトを取得および更新します。
.getAllAnswers()
actual_answers テーブル内のすべてのエントリのリストをAnswer
オブジェクトとして返します。
.doesAnswerWithIdExists(Integer id)
ID を持つ Answer オブジェクトがactual_answers テーブルに存在する場合はtrue
を返します
.getAnswerById(Integer id)
actual_answers テーブルからの対応する ID を持つ Answer オブジェクトを返します。
.addAnswerToTable(Answer answer)
Answer
オブジェクトを取得し、actual_answers テーブルに追加します
.deleteAnswerById(Integer id)
引数のactual_answersテーブルから対応するIDを持つAnswer
オブジェクトを削除します
.updateAnswerById(Integer id, Answer answer)
引数に渡されたAnswer
オブジェクトを使用して、actual_answers テーブルの対応する ID を持つAnswer
オブジェクトを更新します
このセクションでは、プロジェクトで使用される POJO が、POST および PUT リクエストを使用する際のプロパティおよび関連する JSON 構造とともにリストされます。
HTTPリクエスト | タイプ | 関数 |
---|---|---|
言葉 | • 整数ID • 文字列ワード • 二重確率 • ダブルスコア | 該当なし |
ユーザー | • 整数ID • 文字列名 • 文字列メール • 文字列のユーザー名 | { "名前": "スアド", "電子メール": "[email protected]", "ユーザー名": "ススザフラワーポット" } |
答え | • 整数ID • LocalDate 回答日 • 文字列 AnswerOfDay • 整数マシンの結果 | { "回答の日付": "2025-01-04", "answerOfDay": "ウエスト", 「マシン結果」: 3 } |
ゲーム | • 整数ID • 整数のユーザー ID • 整数の AnswerId • 整数の UserGuesses | { 「ユーザーID」: 1、 「回答ID」: 1、 「ユーザー推測」: 3 } |
HTTPリクエスト | タイプ | 関数 |
---|---|---|
ローカルホスト:8080/ヘルパー | 得る | すべての言葉を手に入れましょう。 |
ローカルホスト:8080/ヘルパー/ランク付き | 得る | すべての単語をスコアによってランク付けします。 |
ローカルホスト:8080/helper/ranked/{numOfWords} | 得る | すべての単語をスコアによってランク付けし、返される単語の数を指定します。 |
ローカルホスト:8080/helper/start | 得る | ゲームを開始します。スコア順に最良の推測を返します。 |
localhost:8080/helper/start/{word} | 消去 | {word} の推測を入力し、Wordle から取得したパターンをリクエスト本文に JSON として含めます (つまり、どの文字が緑、黄色、グレーであるか)。例: { "f0": "黄色", "o1": "黄色", "o2": "緑", "d3": "グレー", "s4": "緑" } |
ローカルホスト:8080/ヘルパー/エンドゲーム | 消去 | 正しい単語を取得するとゲームが終了します。 |
HTTPリクエスト | タイプ | 関数 |
---|---|---|
ローカルホスト:8080/helper/wordbyid/{id} | 得る | 単語ごとに ID を取得します。 |
localhost:8080/helper/wordbyname/{単語の名前} | 得る | 単語ごとに名前を取得します。 |
HTTPリクエスト | タイプ | 関数 |
---|---|---|
ローカルホスト:8080/competitive/computemachinescores | 置く | 競技モード設定の一部として実行する必要があります。これにより、マシンの推測がactual_answers テーブルに入力されます。 |
ローカルホスト:8080/競合/すべて | 得る | データベース内のすべてのゲームを取得します。 |
ローカルホスト:8080/competitive/addgame | 役職 | リクエストボディを使用して、新しいゲーム (JSON) をデータベースに追加します。例: { 「ユーザーID」: 1、 「回答ID」: 1、 「ユーザー推測」: 3 } |
localhost:8080/competitive/dailyresults/{date} | 得る | 指定された日付のすべての結果を取得します。 |
localhost:8080/competitive/userresults/{ユーザー名}/{日付} | 得る | 指定された日付のユーザー名に関するすべての結果を取得します。 |
localhost:8080/competitive/userresults/{ユーザー名} | 得る | ユーザー名に関するすべての結果を取得します。 |
localhost:8080/competitive/averageresults/{ユーザー名} | 得る | ユーザーの推測の平均を取得します。 |
ローカルホスト:8080/competitive/start/{userId} | 得る | 一致する ID を持つユーザーのゲームを開始します。 |
localhost:8080/competitive/start/{userid}/{guess} | 消去 | {guess}にはユーザーの推測を入力します。ゲームが完了するまで、推測ごとに繰り返します。 |
ローカルホスト:8080/competitive/start/{userid}/end | 役職 | ユーザーのゲームを終了し、結果をデータベースに保存します。 |
ローカルホスト:8080/ユーザー | 得る | データベースからすべてのユーザーを取得します。 |
ローカルホスト:8080/user/{userId} | 得る | ID によってデータベースからユーザーを取得します。 |
ローカルホスト:8080/ユーザー | 役職 | リクエストボディを使用してユーザー (JSON) をデータベースに追加します。例: { "名前": "スアド", "電子メール": "[email protected]", "ユーザー名": "ススザフラワーポット" } |
HTTPリクエスト | タイプ | 関数 |
---|---|---|
ローカルホスト:8080/competitive/{id} | 置く | リクエストボディを通じて ID によってゲーム (JSON) を更新します。例: { 「ユーザーID」: 1、 「回答ID」: 1、 「ユーザー推測」: 3 } |
ローカルホスト:8080/competitive/{id} | 消去 | IDでゲームを削除します。 |
ローカルホスト:8080/competitive/{id} | 得る | IDでゲームを取得します。 |
ローカルホスト:8080/回答 | 得る | すべての答えを入手してください。 |
localhost:8080/answers/{id} | 得る | 回答 ID によって回答を取得します。 |
localhost:8080/answers/addanswer | 役職 | リクエストボディを使用して回答(JSON)を追加します。例: { "回答の日付": "2025-01-04", "answerOfDay": "ウエスト", 「マシン結果」: 3 } |
localhost:8080/answers/{id} | 消去 | ID で回答を削除します。 |
localhost:8080/answers/update/{id} | 置く | リクエストボディを使用して ID によって回答 (JSON) を更新します。例: { "回答の日付": "2025-01-04", "answerOfDay": "ウエスト", 「マシン結果」: 3 } |
ローカルホスト:8080/user/{userId} | 消去 | IDでユーザーを削除します。 |
ローカルホスト:8080/user/{userId} | 置く | リクエストボディを使用して、ID によってユーザー (JSON) を更新します。例: { "名前": "スアド", "電子メール": "[email protected]", "ユーザー名": "ススザフラワーポット" } |
BNTA チーム、特にトレーナーの Colin、Nelson、Iain に多大な感謝を申し上げます。