我们是 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!