我們是 The Imitation Game,一支由 BNTA Cohort 4 成員 Alex、Cristian、Suad、Rosalinda 和 Rachel 組成的團隊。
該合作項目是 Bright 網路技術學院計劃的一部分。該專案由一個 Wordle 幫助應用程式組成,該應用程式基於 3Blue1Brown 的 YouTube 影片中使用的資訊理論概念 –使用資訊理論解決 Wordle 問題。
該 API 是使用 Java、SpringBoot 和 PostgresQL 創建的,並使用 Postman 進行測試。所有可能單字的清單均取自此處,而每天的 Wordle 答案則透過檢查 Wordle 網站找到。
有兩種模式:
我們的專案要求和開發計劃可以在這裡找到。
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()
與.GetAllWords
相同,只是Word
物件清單按 Score 屬性排名。
.GetAllWordsRankedByScore(Integer numOfWords)
與.GetAllWordsRankedByScore
相同,只是Word
物件列表的大小由numOfWords
給出。
.GetWordById(Integer id)
從original_word_list 表中檢索具有給定id
Word
。
.GetWordByName(String nameOfWord)
從original_word_list 表中檢索word
屬性等於nameOfWord
的第一個Word
。
.WordValidator(String word)
如果給定字串包含在original_word_list 表的word 欄位中,則傳回true
,否則拋出例外。
.setUniformProbabilities(List<Word> wordList)
將每個Word
的機率屬性設為全部相等且總和為 1 後,傳回Word
的輸入清單。例如,將傳回由兩個Word
物件組成的列表,其機率均設為0.5
。
.GenerateWordPattern(Word word, Word targetWord)
傳回一個LinkedHashMap<String, String>
表示透過猜測word
(假設targetWord
是答案)得到的模式。 例如,此處描述的 Wordle 模式將由地圖表示:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
一般來說,鍵用字母後跟標記其在單字中位置的索引來表示。這些值採用三個值"yellow"
、 "green"
和"grey"
每個值代表 Wordle 圖案中字母的顏色。
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
如果word
和targetWord
作為.GenerateWordPattern
方法的參數傳遞時可以重現pattern
,則傳回true
。否則,返回false
。
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
傳回由wordList
中的單字組成的Word
物件列表,當作為.checkPatternMatch
的targetWord
參數傳遞時傳回true
。這裡guess
和pattern
作為其他參數。
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
對於給定的guess
,計算一個Double
,其值表示獲得給定pattern
的機率。這是透過wordList
中所有Word
物件的機率總和確定的,當作為.checkPatternMatch
的targetWord
參數輸入時,這些物件傳回true
。
.logTwo(Double value)
傳回Double
,其值為參數以 2 為底的對數。
.computeWordScore(Word word, List<Word> wordList)
計算透過猜測word
預計wordList
大小減半的次數的平均值。
.computeScoreDistribution(List<Word> wordList)
將.computeWordScore
方法套用至wordList
中的每個Word
,並將score
屬性設定為該方法傳回的值。然後傳回Word
的結果清單。
getGuessesForAnswer(Answer answer)
計算 Wordle 解算器猜測answer
所需的猜測次數。然後返回answer
,並將machineResult
屬性設定為計算值。
AnswerService
)此服務類別呼叫資料存取層以從資料庫檢索和更新Answer
物件。
.getAllAnswers()
傳回actual_answers 表中所有條目的清單作為Answer
物件。
.doesAnswerWithIdExists(Integer id)
如果實際答案表中存在具有 id 的 Answer 對象,則傳回true
.getAnswerById(Integer id)
傳回帶有實際答案表中對應 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]”, "userName": "蘇蘇花盆" } |
回答 | • 整數ID • LocalDate 答覆日期 • 字串 AnswerOfDay • 整數機器結果 | { “回答日期”:“2025-01-04”, "answerOfDay": "腰", 「機器結果」:3 } |
遊戲 | • 整數ID • 整數使用者ID • 整數 AnswerId • 整數使用者猜測 | { “用戶ID”:1, 「答案ID」:1, “用戶猜測”:3 } |
HTTP請求 | 類型 | 功能 |
---|---|---|
本地主機:8080/助手 | 得到 | 獲取所有單字。 |
本地主機:8080/helper/排名 | 得到 | 獲取所有單字按分數排名。 |
本機:8080/helper/ranked/{numOfWords} | 得到 | 取得按分數排名的所有單字並指定傳回的單字數。 |
本機:8080/helper/啟動 | 得到 | 開始遊戲。將返回按分數排序的最佳猜測。 |
本機:8080/helper/start/{word} | 刪除 | 輸入您對 {word} 的猜測,並將您從 Wordle 獲得的模式作為 JSON 包含在請求正文中(即哪些字母是綠色、黃色、灰色)。例子: { “f0”:“黃色”, "o1": "黃色", “o2”:“綠色”, “d3”:“灰色”, “s4”:“綠色” } |
本機:8080/helper/endgame | 刪除 | 當您得到正確的單字時結束遊戲。 |
HTTP請求 | 類型 | 功能 |
---|---|---|
本機:8080/helper/wordbyid/{id} | 得到 | 逐字獲取 id。 |
本機:8080/helper/wordbyname/{nameofword} | 得到 | 逐字獲取單字名稱。 |
HTTP請求 | 類型 | 功能 |
---|---|---|
本地主機:8080/competitive/computemachinescores | 放 | 需要作為競爭模式設定的一部分來運作。這將填充實際答案表中的機器猜測。 |
本地主機:8080/競賽/全部 | 得到 | 取得資料庫中的所有遊戲。 |
本地主機:8080/competitive/addgame | 郵政 | 使用請求內文將新遊戲 (JSON) 新增至資料庫。例子: { “用戶ID”:1, 「答案ID」:1, “用戶猜測”:3 } |
本地主機:8080/competitive/dailyresults/{date} | 得到 | 取得給定日期的所有結果。 |
本機:8080/competitive/userresults/{使用者名稱}/{日期} | 得到 | 取得給定日期使用者名稱的所有結果。 |
本機:8080/competitive/userresults/{使用者名稱} | 得到 | 取得用戶名的所有結果。 |
本機:8080/competitive/averageresults/{使用者名稱} | 得到 | 取得使用者猜測的平均值。 |
本機:8080/competitive/start/{userId} | 得到 | 為具有匹配 ID 的用戶開始遊戲。 |
本機:8080/competitive/start/{userid}/{guess} | 刪除 | 在{guess}中輸入使用者的猜測。重複每個猜測,直到遊戲完成。 |
本機:8080/competitive/start/{userid}/end | 郵政 | 用戶結束遊戲並將結果儲存到資料庫。 |
本地主機:8080/用戶 | 得到 | 從資料庫中獲取所有使用者。 |
本機:8080/使用者/{userId} | 得到 | 透過id從資料庫中獲取用戶。 |
本地主機:8080/用戶 | 郵政 | 使用請求內文將使用者 (JSON) 新增至資料庫。例子: { “名稱”:“蘇阿德”, “電子郵件”:“[email protected]”, "userName": "蘇蘇花盆" } |
HTTP請求 | 類型 | 功能 |
---|---|---|
本地主機:8080/competitive/{id} | 放 | 透過請求正文按 id 更新遊戲 (JSON)。例子: { “用戶ID”:1, 「答案ID」:1, “用戶猜測”:3 } |
本地主機:8080/competitive/{id} | 刪除 | 透過id刪除遊戲。 |
本地主機:8080/competitive/{id} | 得到 | 透過id獲取遊戲。 |
本地主機:8080/answers | 得到 | 得到所有的答案。 |
本地主機:8080/answers/{id} | 得到 | 透過答案 ID 取得答案。 |
本地主機:8080/answers/addanswer | 郵政 | 使用請求正文添加答案 (JSON)。例子: { “回答日期”:“2025-01-04”, "answerOfDay": "腰", 「機器結果」:3 } |
本地主機:8080/answers/{id} | 刪除 | 按 id 刪除答案。 |
本地主機:8080/answers/update/{id} | 放 | 使用請求正文按 id 更新答案 (JSON)。例子: { “回答日期”:“2025-01-04”, "answerOfDay": "腰", 「機器結果」:3 } |
本機:8080/使用者/{userId} | 刪除 | 透過id刪除用戶。 |
本機:8080/使用者/{userId} | 放 | 使用請求正文按 ID 更新使用者 (JSON)。例子: { “名稱”:“蘇阿德”, “電子郵件”:“[email protected]”, "userName": "蘇蘇花盆" } |
非常感謝 BNTA 團隊,特別是我們的訓練師 Colin、Nelson 和 Iain!