เราคือ The Imitation Game ซึ่งเป็นทีมที่ประกอบด้วยสมาชิก BNTA Cohort 4, Alex, Cristian, Suad, Rosalinda และ Rachel
โครงการความร่วมมือนี้เสร็จสมบูรณ์โดยเป็นส่วนหนึ่งของโครงการ Bright Network Technology Academy โปรเจ็กต์นี้ประกอบด้วยแอปพลิเคชันตัวช่วย Wordle ซึ่งอิงตามแนวคิดของทฤษฎีข้อมูลที่ใช้ในวิดีโอ YouTube โดย 3Blue1Brown – การแก้ Wordle โดยใช้ทฤษฎีสารสนเทศ
API ถูกสร้างขึ้นโดยใช้ Java, SpringBoot และ PostgresQL และทดสอบโดยใช้บุรุษไปรษณีย์ รายการคำที่เป็นไปได้ทั้งหมดถูกนำมาจากที่นี่ ในขณะที่ค้นหาคำตอบสำหรับ Wordle ในแต่ละวันโดยการตรวจสอบจากเว็บไซต์ Wordle
มีสองโหมด:
สามารถดูข้อกำหนดโครงการและกำหนดการพัฒนาของเราได้ที่นี่
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
และเปิดใน Java IDE ที่คุณชื่นชอบ (เราขอแนะนำ IntelliJ)wordle
(หากใช้เทอร์มินัล ให้พิมพ์ psql
เพื่อเปิดใช้ PostgresQL จากนั้นเรียกใช้ CREATE DATABASE wordle;
)worlde.sql
เพื่อเติมตารางฐานข้อมูล wordle
ของคุณ ในการดำเนินการนี้ คุณสามารถดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้หมายเหตุ — ไม่จำเป็นต้องใช้คำสั่ง DROP TABLES ที่จุดเริ่มต้นของสคริปต์ sql หากตั้งค่าฐานข้อมูลเป็นครั้งแรก (ดูด้านล่าง):
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
จะถูกจัดอันดับตามคุณสมบัติคะแนน
.GetAllWordsRankedByScore(Integer numOfWords)
เช่นเดียวกับ .GetAllWordsRankedByScore
ยกเว้นรายการวัตถุ Word
มีขนาดที่กำหนดโดย numOfWords
.GetWordById(Integer id)
ดึง Word
ด้วย id
ที่กำหนดจากตาราง original_word_list
.GetWordByName(String nameOfWord)
ดึง Word
แรกที่มีคุณสมบัติ word
เท่ากับ nameOfWord
จากตาราง original_word_list
.WordValidator(String word)
คืนค่า true
หากสตริงที่ระบุรวมอยู่ในคอลัมน์คำในตาราง original_word_list มิฉะนั้นจะเกิดข้อยกเว้น
.setUniformProbabilities(List<Word> wordList)
ส่งคืนรายการอินพุตของวัตถุ Word
หลังจากตั้งค่าคุณสมบัติความน่าจะเป็นของ 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)
คืนค่า true
หาก word
และ targetWord
สามารถสร้าง pattern
ใหม่ได้เมื่อส่งผ่านเป็นอาร์กิวเมนต์ของเมธอด .GenerateWordPattern
มิฉะนั้นจะส่งคืน false
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
ส่งคืนรายการวัตถุ Word
ที่ประกอบด้วยคำใน wordList
ที่คืนค่า true
เมื่อส่งผ่านเป็นอาร์กิวเมนต์ targetWord
ของ . .checkPatternMatch
ในที่นี้ guess
และ pattern
ทำหน้าที่เป็นข้อโต้แย้งอื่นๆ
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
สำหรับ guess
ที่กำหนด ให้คำนวณ Double
ซึ่งค่าแสดงถึงความน่าจะเป็นที่ได้รับ pattern
ที่กำหนด ซึ่งพิจารณาจากผลรวมของความน่าจะเป็นของออบเจ็กต์ Word
ทั้งหมดใน wordList
ที่ให้ผลตอบแทน true
เมื่อป้อนเป็นอาร์กิวเมนต์ targetWord
สำหรับ . .checkPatternMatch
.logTwo(Double value)
ส่งกลับค่า Double
ซึ่งมีค่าเป็นฐานบันทึกที่สองของอาร์กิวเมนต์
.computeWordScore(Word word, List<Word> wordList)
คำนวณค่าเฉลี่ยของจำนวนครั้งที่คาดว่า wordList
จะลดลงครึ่งหนึ่งโดยการเดา word
.computeScoreDistribution(List<Word> wordList)
ใช้เมธอด .computeWordScore
กับแต่ละ Word
ใน wordList
และตั้งค่าคุณสมบัติ score
เป็นค่าที่ส่งคืนโดยเมธอด รายการผลลัพธ์ของวัตถุ Word
จะถูกส่งกลับ
getGuessesForAnswer(Answer answer)
คำนวณจำนวนการเดาที่นักแก้ Wordle เดา answer
จากนั้น answer
จะถูกส่งกลับพร้อมกับคุณสมบัติ machineResult
ที่ตั้งค่าเป็นค่าที่คำนวณได้
AnswerService
) คลาสบริการนี้เรียกใช้ชั้นการเข้าถึงข้อมูลเพื่อดึงและอัปเดตออบเจ็กต์ Answer
จากฐานข้อมูล
.getAllAnswers()
ส่งคืนรายการทั้งหมดในตารางactual_answersเป็นออบเจ็กต์ Answer
.doesAnswerWithIdExists(Integer id)
คืนค่า true
หากมีวัตถุ Answer ที่มีรหัสอยู่ในตารางactual_answers
.getAnswerById(Integer id)
ส่งกลับวัตถุคำตอบด้วยรหัสที่สอดคล้องกันจากตารางactual_answers
.addAnswerToTable(Answer answer)
รับวัตถุ Answer
และเพิ่มลงในตารางactual_answers
.deleteAnswerById(Integer id)
ลบ Answer
วัตถุที่มีรหัสที่สอดคล้องกันจากตาราง real_answers จากอาร์กิวเมนต์
.updateAnswerById(Integer id, Answer answer)
อัปเดตวัตถุ Answer
ด้วยรหัสที่สอดคล้องกันจากตารางactual_answersพร้อมวัตถุ Answer
ที่ส่งผ่านในอาร์กิวเมนต์
ในส่วนนี้ POJO ที่ใช้ในโปรเจ็กต์จะแสดงรายการพร้อมกับคุณสมบัติและโครงสร้าง JSON ที่เกี่ยวข้องเมื่อใช้คำขอ POST และ PUT:
คำขอ HTTP | พิมพ์ | การทำงาน |
---|---|---|
คำ | • รหัสจำนวนเต็ม • สตริงเวิร์ด • ความน่าจะเป็นสองเท่า • คะแนนสองเท่า | ไม่มี |
ผู้ใช้ | • รหัสจำนวนเต็ม • ชื่อสตริง • สตริงอีเมล • ชื่อผู้ใช้สตริง | - "ชื่อ": "ซูด", "อีเมล": "[email protected]", "ชื่อผู้ใช้": "SusuTheflowerPot" - |
คำตอบ | • รหัสจำนวนเต็ม • LocalDate DateOfAnswer • สตริง AnswerOfDay • ผลลัพธ์ของเครื่องจักรจำนวนเต็ม | - "dateOfAnswer": "2025-01-04", "answerOfDay": "เอว", "ผลลัพธ์ของเครื่องจักร": 3 - |
เกม | • รหัสจำนวนเต็ม • UserId จำนวนเต็ม • รหัสคำตอบจำนวนเต็ม • UserGuesses จำนวนเต็ม | - "รหัสผู้ใช้": 1, "รหัสคำตอบ": 1, "ผู้ใช้เดา": 3 - |
คำขอ HTTP | พิมพ์ | การทำงาน |
---|---|---|
localhost:8080/ผู้ช่วย | รับ | ได้ทุกคำ.. |
localhost:8080/ผู้ช่วย/จัดอันดับ | รับ | รับคำทั้งหมดจัดอันดับตามคะแนน |
localhost:8080/helper/ranked/{numOfWords} | รับ | รับคำทั้งหมดจัดอันดับตามคะแนนและระบุจำนวนคำที่ส่งคืน |
localhost:8080/ผู้ช่วย/เริ่มต้น | รับ | เริ่มเกม จะส่งกลับการคาดเดาที่ดีที่สุดโดยเรียงตามคะแนน |
localhost:8080/helper/start/{คำ} | ลบ | ป้อนการเดาของคุณสำหรับ {word} และรวมรูปแบบที่คุณได้รับจาก Wordle ไว้ในเนื้อหาคำขอเป็น JSON (เช่น ตัวอักษรที่เป็นสีเขียว เหลือง สีเทา) ตัวอย่าง: - "f0": "สีเหลือง", "o1": "สีเหลือง", "o2": "สีเขียว", "d3": "สีเทา", "s4": "สีเขียว" - |
localhost:8080/ผู้ช่วย/endgame | ลบ | จบเกมเมื่อคุณได้คำที่ถูกต้อง |
คำขอ HTTP | พิมพ์ | การทำงาน |
---|---|---|
localhost:8080/ผู้ช่วย/wordbyid/{id} | รับ | รับรหัสคำต่อคำ |
localhost:8080/helper/wordbyname/{nameofword} | รับ | รับคำต่อคำชื่อ |
คำขอ HTTP | พิมพ์ | การทำงาน |
---|---|---|
localhost:8080/การแข่งขัน/คะแนนเครื่องคำนวณ | ใส่ | จำเป็นในการใช้งานโดยเป็นส่วนหนึ่งของการตั้งค่าโหมดการแข่งขัน สิ่งนี้จะเติมข้อมูลการเดาของเครื่องในตารางactual_answers |
localhost:8080/แข่งขัน/ทั้งหมด | รับ | รับเกมทั้งหมดในฐานข้อมูล |
localhost:8080/แข่งขัน/addgame | โพสต์ | เพิ่มเกมใหม่ (JSON) ลงในฐานข้อมูลโดยใช้ Request Body ตัวอย่าง: - "รหัสผู้ใช้": 1, "รหัสคำตอบ": 1, "ผู้ใช้เดา": 3 - |
localhost:8080/การแข่งขัน/ผลรายวัน/{วันที่} | รับ | รับผลลัพธ์ทั้งหมดในวันที่กำหนด |
localhost:8080/competitive/userresults/{ชื่อผู้ใช้}/{date} | รับ | รับผลลัพธ์ทั้งหมดสำหรับชื่อผู้ใช้ที่กำหนดวันที่ |
localhost:8080/การแข่งขัน/ผลผู้ใช้/{ชื่อผู้ใช้} | รับ | รับผลลัพธ์ทั้งหมดสำหรับชื่อผู้ใช้ |
localhost:8080/การแข่งขัน/ผลเฉลี่ย/{ชื่อผู้ใช้} | รับ | รับค่าเฉลี่ยของการคาดเดาของผู้ใช้ |
localhost:8080/การแข่งขัน/เริ่มต้น/{รหัสผู้ใช้} | รับ | เริ่มเกมสำหรับผู้ใช้ที่มีรหัสตรงกัน |
localhost:8080/การแข่งขัน/เริ่มต้น/{userid}/{เดา} | ลบ | ป้อนการเดาของผู้ใช้ใน {guess} ทำซ้ำสำหรับการเดาแต่ละครั้งจนกว่าเกมจะเสร็จสิ้น |
localhost:8080/competitive/start/{userid}/end | โพสต์ | จบเกมสำหรับผู้ใช้และบันทึกผลลัพธ์ลงฐานข้อมูล |
โลคัลโฮสต์:8080/ผู้ใช้ | รับ | รับผู้ใช้ทั้งหมดจากฐานข้อมูล |
localhost:8080/ผู้ใช้/{รหัสผู้ใช้} | รับ | รับผู้ใช้จากฐานข้อมูลด้วยรหัส |
โลคัลโฮสต์:8080/ผู้ใช้ | โพสต์ | เพิ่มผู้ใช้ (JSON) ลงในฐานข้อมูลโดยใช้ Request Body ตัวอย่าง: - "ชื่อ": "ซูด", "อีเมล": "[email protected]", "ชื่อผู้ใช้": "SusuTheflowerPot" - |
คำขอ HTTP | พิมพ์ | การทำงาน |
---|---|---|
localhost:8080/แข่งขัน/{id} | ใส่ | อัปเดตเกม (JSON) ด้วยรหัสผ่าน Request Body ตัวอย่าง: - "รหัสผู้ใช้": 1, "รหัสคำตอบ": 1, "ผู้ใช้เดา": 3 - |
localhost:8080/แข่งขัน/{id} | ลบ | ลบเกมด้วยไอดี |
localhost:8080/แข่งขัน/{id} | รับ | รับเกมด้วยไอดี |
โลคัลโฮสต์:8080/คำตอบ | รับ | ได้คำตอบทั้งหมด |
โฮสต์ท้องถิ่น:8080/คำตอบ/{id} | รับ | รับคำตอบด้วยรหัสคำตอบ |
localhost:8080/answers/เพิ่มคำตอบ | โพสต์ | เพิ่มคำตอบ (JSON) โดยใช้เนื้อหาคำขอ ตัวอย่าง: - "dateOfAnswer": "2025-01-04", "answerOfDay": "เอว", "ผลลัพธ์ของเครื่องจักร": 3 - |
โฮสต์ท้องถิ่น:8080/คำตอบ/{id} | ลบ | ลบคำตอบด้วย ID |
โฮสต์ท้องถิ่น:8080/คำตอบ/อัปเดต/{id} | ใส่ | อัปเดตคำตอบ (JSON) โดย id โดยใช้ Request Body ตัวอย่าง: - "dateOfAnswer": "2025-01-04", "answerOfDay": "เอว", "ผลลัพธ์ของเครื่องจักร": 3 - |
localhost:8080/ผู้ใช้/{รหัสผู้ใช้} | ลบ | ลบผู้ใช้ด้วยรหัส |
localhost:8080/ผู้ใช้/{รหัสผู้ใช้} | ใส่ | อัปเดตผู้ใช้ (JSON) ด้วย id โดยใช้ Request Body ตัวอย่าง: - "ชื่อ": "ซูด", "อีเมล": "[email protected]", "ชื่อผู้ใช้": "SusuTheflowerPot" - |
ขอขอบคุณทีม BNTA เป็นอย่างยิ่ง และโดยเฉพาะอย่างยิ่งผู้ฝึกสอนของเรา คอลิน เนลสัน และเอียน!