Somos The Imitation Game, uma equipe composta por membros do BNTA Cohort 4, Alex, Cristian, Suad, Rosalinda e Rachel.
Este projeto colaborativo foi concluído como parte do programa Bright Network Technology Academy. O projeto consiste em um aplicativo auxiliar Wordle, baseado nos conceitos da teoria da informação utilizados em um vídeo do YouTube de 3Blue1Brown – Solving Wordle using Information Theory .
A API foi criada usando Java, SpringBoot e PostgresQL e testada usando Postman. A lista de todas as palavras possíveis foi retirada daqui, enquanto as respostas para o Wordle de cada dia foram encontradas inspecionando o site do Wordle.
Existem dois modos:
Nossos requisitos de projeto e cronograma de desenvolvimento podem ser encontrados aqui.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
e abra em seu IDE Java favorito (recomendamos IntelliJ)wordle
. (Se estiver usando o terminal, digite psql
para iniciar o PostgresQL e, em seguida, execute CREATE DATABASE wordle;
)worlde.sql
para preencher suas tabelas de banco de dados wordle
. Para fazer isso, você pode:Nota — os comandos DROP TABLES no início do script sql não são necessários se estiver configurando o banco de dados pela primeira vez (veja abaixo):
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;
Observe também – Para os comandos abaixo, certifique-se de substituir pelos caminhos de arquivo corretos:
-- 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
. Observe que esse estágio pode levar algum tempo, pois calcula as pontuações da máquina para todas as aproximadamente 3.000 respostas reais! Veja abaixo uma lista de métodos usados em cada classe e suas descrições:
WordService
) Esta classe de serviço invoca a camada de acesso a dados para recuperar objetos Word
do banco de dados. Além disso, também contém métodos relativos à lógica do próprio solucionador Wordle.
.GetAllWords()
Retorne uma lista de todas as entradas na tabela original_word_list como objetos Word
.
.GetAllWordsRankedByScore()
O mesmo que .GetAllWords
exceto que a lista de objetos Word
é classificada pela propriedade score.
.GetAllWordsRankedByScore(Integer numOfWords)
O mesmo que .GetAllWordsRankedByScore
exceto que a lista de objetos Word
tem um tamanho fornecido por numOfWords
.
.GetWordById(Integer id)
Recupera Word
com id
fornecido da tabela original_word_list.
.GetWordByName(String nameOfWord)
Recupera o primeiro Word
cuja propriedade word
é igual nameOfWord
da tabela original_word_list.
.WordValidator(String word)
Retorna true
se determinada string estiver incluída na coluna de palavras na tabela original_word_list, caso contrário, uma exceção será lançada.
.setUniformProbabilities(List<Word> wordList)
Retorna a lista de entrada de objetos Word
após definir a propriedade de probabilidade de cada Word
como todos iguais e soma como unidade. Como exemplo, uma lista composta por dois objetos Word
será retornada com probabilidades ambas definidas como 0.5
.
.GenerateWordPattern(Word word, Word targetWord)
Retorna um LinkedHashMap<String, String>
representando o padrão obtido ao adivinhar word
assumindo que targetWord
é a resposta. Por exemplo, o padrão Wordle representado aqui seria representado pelo mapa:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
Em geral, as chaves são indicadas pela letra seguida do índice que marca sua posição na palavra. Os valores assumem três valores "yellow"
, "green"
e "grey"
cada um representando a cor da letra no padrão Wordle.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Retorna true
se word
e targetWord
puderem reproduzir pattern
quando passados como argumentos do método .GenerateWordPattern
. Caso contrário, false
será retornado.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Retorna uma lista de objetos Word
que consiste nas palavras em wordList
que retornam true
quando passadas como o argumento targetWord
de .checkPatternMatch
. Aqui, guess
e pattern
servem como outros argumentos.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Para uma determinada guess
, calcule um Double
cujo valor representa a probabilidade de o pattern
determinado ser obtido. Isso é determinado através da soma das probabilidades de todos os objetos Word
em wordList
que retornam true
quando inseridos como o argumento targetWord
para .checkPatternMatch
.
.logTwo(Double value)
Retorna o Double
cujo valor é o log da base dois do argumento.
.computeWordScore(Word word, List<Word> wordList)
Calcula a média do número de vezes que se espera que wordList
tenha seu tamanho reduzido pela metade adivinhando word
.
.computeScoreDistribution(List<Word> wordList)
Aplica o método .computeWordScore
a cada Word
em wordList
e define a propriedade score
como o valor retornado pelo método. A lista resultante de objetos Word
é então retornada.
getGuessesForAnswer(Answer answer)
Calcula o número de suposições feitas para o solucionador do Wordle adivinhar answer
. A answer
é então retornada com a propriedade machineResult
definida com o valor computado.
AnswerService
) Esta classe de serviço invoca a camada de acesso a dados para recuperar e atualizar objetos Answer
do banco de dados.
.getAllAnswers()
Retorna uma lista de todas as entradas na tabela actual_answers como objetos Answer
.
.doesAnswerWithIdExists(Integer id)
Retorna true
se o objeto Answer com o id existir na tabela actual_answers
.getAnswerById(Integer id)
Retorna o objeto Answer com o id correspondente da tabela actual_answers
.addAnswerToTable(Answer answer)
Pega o objeto Answer
e adiciona à tabela actual_answers
.deleteAnswerById(Integer id)
Exclui o objeto Answer
com o id correspondente da tabela actual_answers do argumento
.updateAnswerById(Integer id, Answer answer)
Atualiza o objeto Answer
com o id correspondente da tabela actual_answers com o objeto Answer
passado no argumento
Nesta seção, os POJOs usados no projeto são listados junto com suas propriedades e estrutura JSON relacionada ao usar solicitações POST e PUT:
Solicitação HTTP | Tipo | Função |
---|---|---|
Palavra | • ID inteiro • Palavra de sequência • Dupla Probabilidade • Pontuação Dupla | N / D |
Usuário | • ID inteiro • Nome da sequência • Cadeia de e-mail • String Nome de usuário | { "nome": "Suad", "e-mail": "[email protected]", "userName": "SusuTheFlowerPot" } |
Responder | • ID inteiro • DataLocalDataDeResposta • String AnswerOfDay • Resultados de máquina inteiros | { "dataOfAnswer": "04/01/2025", "answerOfDay": "cintura", "resultadodamáquina": 3 } |
Jogo | • ID inteiro • UserId inteiro • ID de resposta inteiro • Suposições de usuários inteiros | { "userId": 1, "respostaId": 1, "userGuessed": 3 } |
Solicitação HTTP | Tipo | Função |
---|---|---|
localhost:8080/ajudante | PEGAR | Obtenha todas as palavras. |
localhost:8080/ajudante/classificado | PEGAR | Obtenha todas as palavras classificadas por pontuação. |
localhost:8080/helper/classificado/{numOfWords} | PEGAR | Obtenha todas as palavras classificadas por pontuação e especifique quantas palavras foram retornadas. |
localhost:8080/helper/iniciar | PEGAR | Comece o jogo. Retornará as melhores estimativas ordenadas por pontuação. |
localhost:8080/helper/start/{palavra} | EXCLUIR | Insira seu palpite para {word} e inclua o padrão que você obteve do Wordle no corpo da solicitação como JSON (ou seja, quais letras eram verdes, amarelas, cinza). Exemplo: { "f0": "amarelo", "o1": "amarelo", "o2": "verde", "d3": "cinza", "s4": "verde" } |
localhost:8080/helper/endgame | EXCLUIR | Termina o jogo quando você acerta a palavra. |
Solicitação HTTP | Tipo | Função |
---|---|---|
localhost:8080/helper/wordbyid/{id} | PEGAR | Obtenha a identificação palavra por palavra. |
localhost:8080/helper/palavrapornome/{nomedapalavra} | PEGAR | Obtenha nome palavra por palavra. |
Solicitação HTTP | Tipo | Função |
---|---|---|
localhost:8080/competitivo/computemachinescores | COLOCAR | Necessário para ser executado como parte da configuração do Modo Competitivo. Isso preencherá as estimativas da máquina na tabela actual_answers. |
localhost:8080/competitivo/todos | PEGAR | Obtenha todos os jogos no banco de dados. |
localhost:8080/competitivo/addgame | PUBLICAR | Adicione novo jogo (JSON) ao banco de dados usando Request Body. Exemplo: { "userId": 1, "respostaId": 1, "userGuessed": 3 } |
localhost:8080/competitivo/resultados diários/{data} | PEGAR | Obtenha todos os resultados em determinada data. |
localhost:8080/competitive/userresults/{nomedeusuário}/{data} | PEGAR | Obtenha todos os resultados para a data fornecida pelo nome de usuário. |
localhost:8080/competitive/userresults/{nomedeusuário} | PEGAR | Obtenha todos os resultados para nome de usuário. |
localhost:8080/competitive/averageresults/{nome de usuário} | PEGAR | Obtenha a média das suposições de um usuário. |
localhost:8080/competitivo/start/{userId} | PEGAR | Inicie um jogo para um usuário com ID correspondente. |
localhost:8080/competitive/start/{userid}/{guess} | EXCLUIR | Insira o palpite do usuário em {palpite}. Repita para cada palpite até que o jogo termine. |
localhost:8080/competitivo/start/{userid}/end | PUBLICAR | Finalize o jogo para o usuário e salve o resultado no banco de dados. |
localhost:8080/usuário | PEGAR | Obtenha todos os usuários do banco de dados. |
localhost:8080/usuário/{userId} | PEGAR | Obtenha o usuário do banco de dados por ID. |
localhost:8080/usuário | PUBLICAR | Adicione usuário (JSON) ao banco de dados usando Request Body. Exemplo: { "nome": "Suad", "e-mail": "[email protected]", "userName": "SusuTheFlowerPot" } |
Solicitação HTTP | Tipo | Função |
---|---|---|
localhost:8080/competitivo/{id} | COLOCAR | Atualize o jogo (JSON) por id através do Request Body. Exemplo: { "userId": 1, "respostaId": 1, "userGuessed": 3 } |
localhost:8080/competitivo/{id} | EXCLUIR | Exclua o jogo por id. |
localhost:8080/competitivo/{id} | PEGAR | Obtenha o jogo por id. |
localhost:8080/respostas | PEGAR | Obtenha todas as respostas. |
localhost:8080/respostas/{id} | PEGAR | Obtenha uma resposta por ID de resposta. |
localhost:8080/respostas/addresposta | PUBLICAR | Adicione resposta (JSON) usando Request Body. Exemplo: { "dataOfAnswer": "04/01/2025", "answerOfDay": "cintura", "resultadodamáquina": 3 } |
localhost:8080/respostas/{id} | EXCLUIR | Exclua a resposta por id. |
localhost:8080/respostas/atualização/{id} | COLOCAR | Atualize a resposta (JSON) por id usando Request Body. Exemplo: { "dataOfAnswer": "04/01/2025", "answerOfDay": "cintura", "resultadodamáquina": 3 } |
localhost:8080/usuário/{userId} | EXCLUIR | Excluir usuário por id. |
localhost:8080/usuário/{userId} | COLOCAR | Atualize o usuário (JSON) por id usando Request Body. Exemplo: { "nome": "Suad", "e-mail": "[email protected]", "userName": "SusuTheFlowerPot" } |
Um grande obrigado à equipe do BNTA e especialmente aos nossos treinadores Colin, Nelson e Iain!