저희는 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 웹사이트를 검사하여 찾았습니다.
두 가지 모드가 있습니다:
우리의 프로젝트 요구 사항과 개발 일정은 여기에서 확인할 수 있습니다.
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
와 같은 HTTP 요청을 실행하여 실제_답변 테이블에 컴퓨터 점수를 채웁니다. 이 단계에서는 ~3,000개의 실제 답변 전체에 대한 기계 점수를 계산하므로 시간이 다소 걸릴 수 있습니다. 각 클래스에 사용되는 메서드 목록과 해당 설명은 아래를 참조하세요.
WordService
) 이 서비스 클래스는 데이터 액세스 계층을 호출하여 데이터베이스에서 Word
개체를 검색합니다. 또한 Wordle 해결사 자체의 논리와 관련된 메서드도 포함되어 있습니다.
.GetAllWords()
Original_word_list 테이블의 모든 항목 목록을 Word
개체로 반환합니다.
.GetAllWordsRankedByScore()
Word
개체 목록이 점수 속성에 따라 순위가 결정된다는 점을 제외하면 .GetAllWords
와 동일합니다.
.GetAllWordsRankedByScore(Integer numOfWords)
Word
개체 목록의 크기가 numOfWords
로 지정된다는 점을 제외하면 .GetAllWordsRankedByScore
와 동일합니다.
.GetWordById(Integer id)
Original_word_list 테이블에서 주어진 id
가진 Word
검색합니다.
.GetWordByName(String nameOfWord)
Original_word_list 테이블에서 word
속성이 nameOfWord
와 동일한 첫 번째 Word
검색합니다.
.WordValidator(String word)
주어진 문자열이 Original_word_list 테이블의 단어 열에 포함되어 있으면 true
반환하고, 그렇지 않으면 예외가 발생합니다.
.setUniformProbabilities(List<Word> wordList)
각 Word
의 확률 속성을 모두 동일하고 합이 1로 설정한 후 Word
개체의 입력 목록을 반환합니다. 예를 들어 두 개의 Word
개체로 구성된 목록은 확률이 모두 0.5
로 설정된 상태로 반환됩니다.
.GenerateWordPattern(Word word, Word targetWord)
targetWord
답이라고 가정하고 word
추측하여 얻은 패턴을 나타내는 LinkedHashMap<String, String>
반환합니다. 예를 들어, 여기에 묘사된 Wordle 패턴은 지도로 표현됩니다:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
일반적으로 키는 문자와 단어에서의 위치를 표시하는 색인으로 표시됩니다. 값은 Wordle 패턴의 문자 색상을 나타내는 "yellow"
, "green"
및 "grey"
세 가지 값을 사용합니다.
.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()
실제_답변 테이블의 모든 항목 목록을 Answer
개체로 반환합니다.
.doesAnswerWithIdExists(Integer id)
실제_답변 테이블에 해당 ID를 가진 Answer 개체가 존재하는 경우 true
반환합니다.
.getAnswerById(Integer id)
실제_답변 테이블에서 해당 ID를 가진 답변 개체를 반환합니다.
.addAnswerToTable(Answer answer)
Answer
개체를 가져와 Actual_answers 테이블에 추가합니다.
.deleteAnswerById(Integer id)
인수의 실제_답변 테이블에서 해당 ID를 가진 Answer
개체를 삭제합니다.
.updateAnswerById(Integer id, Answer answer)
인수에 전달된 Answer
개체를 사용하여 실제_답변 테이블의 해당 ID로 Answer
개체를 업데이트합니다.
이 섹션에서는 POST 및 PUT 요청을 사용할 때 프로젝트에 사용된 POJO가 해당 속성 및 관련 JSON 구조와 함께 나열됩니다.
HTTP 요청 | 유형 | 기능 |
---|---|---|
단어 | • 정수 ID • 문자열 단어 • 이중 확률 • 더블 스코어 | 해당 없음 |
사용자 | • 정수 ID • 문자열 이름 • 문자열 이메일 • 문자열 사용자 이름 | { "이름": "수드", "이메일": "[email protected]", "userName": "SusuTheFlowerPot" } |
답변 | • 정수 ID • LocalDate DateOfAnswer • 문자열 AnswerOfDay • 정수 MachineResults | { "dateOfAnswer": "2025-01-04", "answerOfDay": "허리", "machineResult": 3 } |
게임 | • 정수 ID • 정수 사용자 ID • 정수 AnswerId • 정수 UserGuess | { "사용자 ID": 1, "응답 ID": 1, "사용자 추측": 3 } |
HTTP 요청 | 유형 | 기능 |
---|---|---|
로컬호스트:8080/helper | 얻다 | 모든 단어를 얻으십시오. |
로컬 호스트:8080/helper/순위 | 얻다 | 점수로 순위가 매겨진 모든 단어를 가져옵니다. |
로컬 호스트:8080/helper/ranked/{numOfWords} | 얻다 | 점수별로 순위가 매겨진 모든 단어를 가져오고 반환된 단어 수를 지정합니다. |
로컬 호스트:8080/helper/start | 얻다 | 게임을 시작하세요. 점수별로 정렬된 최선의 추측을 반환합니다. |
localhost:8080/helper/start/{단어} | 삭제 | {word}에 대한 추측을 입력하고 요청 본문에 Wordle에서 얻은 패턴을 JSON으로 포함합니다(즉, 어떤 문자가 녹색, 노란색, 회색인지). 예: { "f0": "노란색", "o1": "노란색", "o2": "녹색", "d3": "회색", "s4": "녹색" } |
localhost:8080/helper/endgame | 삭제 | 올바른 단어를 얻으면 게임이 종료됩니다. |
HTTP 요청 | 유형 | 기능 |
---|---|---|
localhost:8080/helper/wordbyid/{id} | 얻다 | 단어 ID별로 단어를 가져옵니다. |
localhost:8080/helper/wordbyname/{wordofword} | 얻다 | 단어 이름별로 단어를 가져옵니다. |
HTTP 요청 | 유형 | 기능 |
---|---|---|
localhost:8080/경쟁력/계산기계점수 | 놓다 | 경쟁 모드 설정의 일부로 실행하는 데 필요합니다. 실제_답변 테이블에 기계 추측이 채워집니다. |
로컬 호스트:8080/경쟁력/모두 | 얻다 | 데이터베이스의 모든 게임을 가져옵니다. |
로컬 호스트:8080/경쟁력/게임 추가 | 우편 | 요청 본문을 사용하여 데이터베이스에 새 게임(JSON)을 추가합니다. 예: { "사용자 ID": 1, "응답 ID": 1, "사용자 추측": 3 } |
localhost:8080/경쟁/일일결과/{날짜} | 얻다 | 특정 날짜에 모든 결과를 가져옵니다. |
localhost:8080/competitive/userresults/{사용자 이름}/{날짜} | 얻다 | 사용자 이름이 지정된 날짜에 대한 모든 결과를 가져옵니다. |
로컬 호스트:8080/경쟁/사용자 결과/{사용자 이름} | 얻다 | 사용자 이름에 대한 모든 결과를 가져옵니다. |
localhost:8080/competitive/averageresults/{사용자 이름} | 얻다 | 사용자 추측의 평균을 구합니다. |
localhost:8080/경쟁/시작/{userId} | 얻다 | 일치하는 ID를 가진 사용자를 위해 게임을 시작합니다. |
localhost:8080/경쟁/시작/{사용자 ID}/{추측} | 삭제 | {guess}에 사용자가 추측한 값을 입력합니다. 게임이 완료될 때까지 각 추측에 대해 반복합니다. |
localhost:8080/경쟁/시작/{사용자 ID}/끝 | 우편 | 사용자를 위해 게임을 종료하고 결과를 데이터베이스에 저장합니다. |
로컬호스트:8080/사용자 | 얻다 | 데이터베이스에서 모든 사용자를 가져옵니다. |
로컬 호스트:8080/사용자/{userId} | 얻다 | ID로 데이터베이스에서 사용자를 가져옵니다. |
로컬호스트:8080/사용자 | 우편 | 요청 본문을 사용하여 데이터베이스에 사용자(JSON)를 추가합니다. 예: { "이름": "수드", "이메일": "[email protected]", "userName": "SusuTheFlowerPot" } |
HTTP 요청 | 유형 | 기능 |
---|---|---|
로컬 호스트:8080/경쟁/{id} | 놓다 | Request Body를 통해 ID별로 게임(JSON)을 업데이트합니다. 예: { "사용자 ID": 1, "응답 ID": 1, "사용자 추측": 3 } |
로컬 호스트:8080/경쟁/{id} | 삭제 | ID로 게임을 삭제합니다. |
로컬 호스트:8080/경쟁/{id} | 얻다 | ID로 게임을 받으세요. |
로컬호스트:8080/대답 | 얻다 | 모든 답변을 얻으세요. |
로컬 호스트:8080/답변/{id} | 얻다 | 답변 ID로 답변을 받으세요. |
로컬 호스트:8080/답변/추가답변 | 우편 | 요청 본문을 사용하여 답변(JSON)을 추가합니다. 예: { "dateOfAnswer": "2025-01-04", "answerOfDay": "허리", "machineResult": 3 } |
로컬 호스트:8080/답변/{id} | 삭제 | ID별 답변을 삭제합니다. |
로컬 호스트:8080/답변/업데이트/{id} | 놓다 | 요청 본문을 사용하여 ID별로 답변(JSON)을 업데이트합니다. 예: { "dateOfAnswer": "2025-01-04", "answerOfDay": "허리", "machineResult": 3 } |
로컬 호스트:8080/사용자/{userId} | 삭제 | ID별로 사용자를 삭제합니다. |
로컬 호스트:8080/사용자/{userId} | 놓다 | 요청 본문을 사용하여 ID별로 사용자(JSON)를 업데이트합니다. 예: { "이름": "수드", "이메일": "[email protected]", "userName": "SusuTheFlowerPot" } |
BNTA 팀, 특히 트레이너인 Colin, Nelson, Iain에게 큰 감사를 드립니다!