Kami adalah The Imitation Game, tim yang terdiri dari anggota BNTA Kohort 4, Alex, Cristian, Suad, Rosalinda, dan Rachel.
Proyek kolaboratif ini diselesaikan sebagai bagian dari program Bright Network Technology Academy. Proyek ini terdiri dari aplikasi pembantu Wordle, berdasarkan konsep teori informasi yang digunakan dalam video YouTube oleh 3Blue1Brown – Solving Wordle menggunakan Teori Informasi .
API dibuat menggunakan Java, SpringBoot, dan PostgresQL, dan diuji menggunakan Postman. Daftar semua kemungkinan kata diambil dari sini, sedangkan jawaban untuk Wordle setiap hari ditemukan dengan memeriksa situs web Wordle.
Ada dua mode:
Persyaratan proyek dan jadwal pengembangan kami dapat ditemukan di sini.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
dan buka di Java IDE favorit Anda (kami merekomendasikan IntelliJ)wordle
. (Jika menggunakan terminal, ketik psql
untuk meluncurkan PostgresQL, lalu jalankan CREATE DATABASE wordle;
)worlde.sql
untuk mengisi tabel database wordle
Anda. Untuk melakukannya, Anda dapat:Catatan — perintah DROP TABLES di awal skrip sql tidak diperlukan jika menyiapkan database untuk pertama kalinya (lihat di bawah):
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;
Catatan Juga — Untuk perintah di bawah ini, pastikan untuk mengganti dengan jalur file yang benar:
-- 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
. Perhatikan bahwa tahap ini mungkin memerlukan waktu, karena tahap ini menghitung skor mesin untuk semua ~3.000 jawaban sebenarnya! Lihat di bawah untuk daftar metode yang digunakan di setiap kelas dan deskripsinya:
WordService
) Kelas layanan ini memanggil lapisan akses data untuk mengambil objek Word
dari database. Selain itu, juga berisi metode yang berkaitan dengan logika pemecah Wordle itu sendiri.
.GetAllWords()
Mengembalikan daftar semua entri dalam tabel original_word_list sebagai objek Word
.
.GetAllWordsRankedByScore()
Sama seperti .GetAllWords
kecuali daftar objek Word
diberi peringkat berdasarkan properti skor.
.GetAllWordsRankedByScore(Integer numOfWords)
Sama seperti .GetAllWordsRankedByScore
kecuali daftar objek Word
memiliki ukuran yang diberikan oleh numOfWords
.
.GetWordById(Integer id)
Mengambil Word
dengan id
yang diberikan dari tabel original_word_list.
.GetWordByName(String nameOfWord)
Mengambil Word
pertama yang properti word
sama dengan nameOfWord
dari tabel original_word_list.
.WordValidator(String word)
Mengembalikan true
jika string yang diberikan disertakan dalam kolom kata dalam tabel original_word_list, jika tidak, pengecualian akan diberikan.
.setUniformProbabilities(List<Word> wordList)
Mengembalikan daftar input objek Word
setelah menyetel properti probabilitas setiap Word
agar semuanya sama dan berjumlah satu. Sebagai contoh, daftar yang terdiri dari dua objek Word
akan dikembalikan dengan probabilitas keduanya diatur ke 0.5
.
.GenerateWordPattern(Word word, Word targetWord)
Mengembalikan LinkedHashMap<String, String>
yang mewakili pola yang diperoleh dengan menebak word
dengan asumsi targetWord
adalah jawabannya. Sebagai contoh, pola Wordle yang digambarkan di sini akan diwakili oleh peta:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
Secara umum, kunci dilambangkan dengan huruf diikuti dengan indeks yang menandai posisinya dalam kata. Nilai tersebut mengambil tiga nilai "yellow"
, "green"
dan "grey"
yang masing-masing mewakili warna huruf dalam pola Wordle.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Mengembalikan true
jika word
dan targetWord
dapat mereproduksi pattern
ketika diteruskan sebagai argumen metode .GenerateWordPattern
. Jika tidak, false
akan dikembalikan.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Mengembalikan daftar objek Word
yang terdiri dari kata-kata dalam wordList
yang mengembalikan true
ketika diteruskan sebagai argumen targetWord
dari .checkPatternMatch
. Di sini guess
dan pattern
berfungsi sebagai argumen lainnya.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Untuk guess
tertentu, hitung Double
yang nilainya mewakili probabilitas diperolehnya pattern
tertentu. Hal ini ditentukan melalui jumlah probabilitas semua objek Word
di wordList
yang memberikan nilai true
ketika dimasukkan sebagai argumen targetWord
untuk .checkPatternMatch
.
.logTwo(Double value)
Mengembalikan Double
yang nilainya merupakan basis log dua argumen.
.computeWordScore(Word word, List<Word> wordList)
Menghitung rata-rata berapa kali seseorang mengharapkan ukuran wordList
dibelah dua dengan menebak word
.
.computeScoreDistribution(List<Word> wordList)
Menerapkan metode .computeWordScore
ke setiap Word
di wordList
dan menyetel properti score
ke nilai yang dikembalikan oleh metode tersebut. Daftar objek Word
yang dihasilkan kemudian dikembalikan.
getGuessesForAnswer(Answer answer)
Menghitung jumlah tebakan yang diambil oleh pemecah Wordle untuk menebak answer
. answer
kemudian dikembalikan dengan properti machineResult
diatur ke nilai yang dihitung.
AnswerService
) Kelas layanan ini memanggil lapisan akses data untuk mengambil dan memperbarui objek Answer
dari database.
.getAllAnswers()
Mengembalikan daftar semua entri dalam tabel aktual_answers sebagai objek Answer
.
.doesAnswerWithIdExists(Integer id)
Mengembalikan true
jika objek Jawaban dengan id ada di tabel aktual_jawaban
.getAnswerById(Integer id)
Mengembalikan objek Jawaban dengan id yang sesuai dari tabel aktual_answers
.addAnswerToTable(Answer answer)
Mengambil objek Answer
dan menambahkan ke tabel aktual_answers
.deleteAnswerById(Integer id)
Menghapus objek Answer
dengan id yang sesuai dari tabel aktual_jawaban dari argumen
.updateAnswerById(Integer id, Answer answer)
Memperbarui objek Answer
dengan id yang sesuai dari tabel aktual_jawaban dengan objek Answer
yang diteruskan dalam argumen
Di bagian ini, POJO yang digunakan dalam proyek dicantumkan beserta propertinya dan struktur JSON terkait saat menggunakan permintaan POST dan PUT:
Permintaan HTTP | Jenis | Fungsi |
---|---|---|
Kata | • ID bilangan bulat • Rangkaian Kata • Probabilitas Ganda • Skor Ganda | T/A |
Pengguna | • ID bilangan bulat • Nama Rangkaian • Rangkaian Email • Rangkaian Nama Pengguna | { "nama": "Suad", "email": "[email protected]", "namapengguna": "SusuTheFlowerPot" } |
Menjawab | • ID bilangan bulat • Tanggal Lokal Tanggal Jawaban • String Jawaban Hari Ini • Hasil Mesin Integer | { "dateOfAnswer": "04-01-2025", "answerOfDay": "pinggang", "Hasil mesin": 3 } |
Permainan | • ID bilangan bulat • ID Pengguna Bilangan Bulat • JawabanId Bilangan Bulat • Tebakan Pengguna Integer | { "ID pengguna": 1, "jawabanId": 1, "tebak pengguna": 3 } |
Permintaan HTTP | Jenis | Fungsi |
---|---|---|
localhost:8080/pembantu | MENDAPATKAN | Dapatkan semua kata. |
localhost:8080/helper/peringkat | MENDAPATKAN | Dapatkan semua kata diberi peringkat berdasarkan skor. |
localhost:8080/helper/peringkat/{numOfWords} | MENDAPATKAN | Dapatkan semua kata diberi peringkat berdasarkan skor dan tentukan berapa banyak kata yang dikembalikan. |
localhost:8080/helper/mulai | MENDAPATKAN | Mulai permainan. Akan mengembalikan tebakan terbaik yang diurutkan berdasarkan skor. |
localhost:8080/helper/start/{word} | MENGHAPUS | Masukkan tebakan Anda untuk {word} dan sertakan pola yang Anda dapatkan dari Wordle di isi permintaan sebagai JSON (yaitu huruf mana yang berwarna hijau, kuning, abu-abu). Contoh: { "f0": "kuning", "o1": "kuning", "o2": "hijau", "d3": "abu-abu", "s4": "hijau" } |
localhost:8080/helper/endgame | MENGHAPUS | Berakhir permainan ketika Anda mendapatkan kata yang benar. |
Permintaan HTTP | Jenis | Fungsi |
---|---|---|
localhost:8080/helper/wordbyid/{id} | MENDAPATKAN | Dapatkan kata demi kata id. |
localhost:8080/helper/wordbyname/{nameofword} | MENDAPATKAN | Dapatkan nama kata demi kata. |
Permintaan HTTP | Jenis | Fungsi |
---|---|---|
localhost:8080/competitive/computemachinescores | MELETAKKAN | Diperlukan untuk dijalankan sebagai bagian dari pengaturan Mode Kompetitif. Ini akan mengisi tebakan mesin di tabel aktual_answers. |
localhost:8080/kompetitif/semua | MENDAPATKAN | Dapatkan semua game di database. |
localhost:8080/kompetitif/addgame | POS | Tambahkan game baru (JSON) ke database menggunakan Badan Permintaan. Contoh: { "ID pengguna": 1, "jawabanId": 1, "tebak pengguna": 3 } |
localhost:8080/competitive/dailyresults/{tanggal} | MENDAPATKAN | Dapatkan semua hasil pada tanggal tertentu. |
localhost:8080/competitive/userresults/{nama pengguna}/{tanggal} | MENDAPATKAN | Dapatkan semua hasil untuk nama pengguna pada tanggal tertentu. |
localhost:8080/competitive/userresults/{nama pengguna} | MENDAPATKAN | Dapatkan semua hasil untuk nama pengguna. |
localhost:8080/competitive/averageresults/{nama pengguna} | MENDAPATKAN | Dapatkan rata-rata tebakan pengguna. |
localhost:8080/competitive/start/{userId} | MENDAPATKAN | Mulai permainan untuk pengguna dengan id yang cocok. |
localhost:8080/competitive/start/{userid}/{guess} | MENGHAPUS | Masukkan tebakan pengguna dalam {guess}. Ulangi untuk setiap tebakan hingga permainan selesai. |
localhost:8080/competitive/start/{userid}/end | POS | Akhiri permainan untuk pengguna dan simpan hasilnya ke database. |
localhost:8080/pengguna | MENDAPATKAN | Dapatkan semua pengguna dari database. |
localhost:8080/pengguna/{userId} | MENDAPATKAN | Dapatkan pengguna dari database berdasarkan id. |
localhost:8080/pengguna | POS | Tambahkan pengguna (JSON) ke database menggunakan Badan Permintaan. Contoh: { "nama": "Suad", "email": "[email protected]", "namapengguna": "SusuTheFlowerPot" } |
Permintaan HTTP | Jenis | Fungsi |
---|---|---|
localhost:8080/kompetitif/{id} | MELETAKKAN | Perbarui game (JSON) berdasarkan id melalui Badan Permintaan. Contoh: { "ID pengguna": 1, "jawabanId": 1, "tebak pengguna": 3 } |
localhost:8080/kompetitif/{id} | MENGHAPUS | Hapus game berdasarkan id. |
localhost:8080/kompetitif/{id} | MENDAPATKAN | Dapatkan game berdasarkan id. |
localhost:8080/jawaban | MENDAPATKAN | Dapatkan semua jawaban. |
localhost:8080/jawaban/{id} | MENDAPATKAN | Dapatkan jawaban berdasarkan id jawaban. |
localhost:8080/jawaban/tambahkanjawaban | POS | Tambahkan jawaban (JSON) menggunakan Badan Permintaan. Contoh: { "dateOfAnswer": "04-01-2025", "answerOfDay": "pinggang", "Hasil mesin": 3 } |
localhost:8080/jawaban/{id} | MENGHAPUS | Hapus jawaban berdasarkan id. |
localhost:8080/jawaban/perbarui/{id} | MELETAKKAN | Perbarui jawaban (JSON) berdasarkan id menggunakan Badan Permintaan. Contoh: { "dateOfAnswer": "04-01-2025", "answerOfDay": "pinggang", "Hasil mesin": 3 } |
localhost:8080/pengguna/{userId} | MENGHAPUS | Hapus pengguna berdasarkan id. |
localhost:8080/pengguna/{userId} | MELETAKKAN | Perbarui pengguna (JSON) berdasarkan id menggunakan Badan Permintaan. Contoh: { "nama": "Suad", "email": "[email protected]", "namapengguna": "SusuTheFlowerPot" } |
Terima kasih yang sebesar-besarnya kepada tim BNTA, dan khususnya kepada pelatih kami, Colin, Nelson, dan Iain!