Somos The Imitation Game, un equipo formado por miembros de BNTA Cohort 4, Alex, Cristian, Suad, Rosalinda y Rachel.
Este proyecto colaborativo se completó como parte del programa Bright Network Technology Academy. El proyecto consiste en una aplicación auxiliar de Wordle, basada en los conceptos de teoría de la información utilizados en un video de YouTube de 3Blue1Brown – Solving Wordle usando la teoría de la información .
La API se creó con Java, SpringBoot y PostgresQL y se probó con Postman. La lista de todas las palabras posibles se tomó de aquí, mientras que las respuestas para el Wordle de cada día se encontraron inspeccionando el sitio web de Wordle.
Hay dos modos:
Los requisitos de nuestro proyecto y el cronograma de desarrollo se pueden encontrar aquí.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
y ábrelo en tu IDE de Java favorito (recomendamos IntelliJ)wordle
. (Si usa la terminal, escriba psql
para iniciar PostgresQL y luego ejecute CREATE DATABASE wordle;
)worlde.sql
para completar las tablas de su base de datos wordle
. Para hacer esto, puedes:Nota : los comandos DROP TABLES al comienzo del script SQL no son necesarios si configura la base de datos por primera vez (ver a continuación):
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;
Nota también : Para los siguientes comandos, asegúrese de reemplazarlos con las rutas de archivo correctas:
-- 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
. Tenga en cuenta que esta etapa puede llevar algún tiempo, ya que calcula las puntuaciones de la máquina para las aproximadamente 3000 respuestas reales. Consulte a continuación una lista de los métodos utilizados en cada clase y sus descripciones:
WordService
) Esta clase de servicio invoca la capa de acceso a datos para recuperar objetos Word
de la base de datos. Además, también contiene métodos relacionados con la lógica del propio solucionador de Wordle.
.GetAllWords()
Devuelve una lista de todas las entradas en la tabla original_word_list como objetos Word
.
.GetAllWordsRankedByScore()
Igual que .GetAllWords
excepto que la lista de objetos Word
se clasifica según la propiedad de puntuación.
.GetAllWordsRankedByScore(Integer numOfWords)
Igual que .GetAllWordsRankedByScore
excepto que la lista de objetos Word
tiene un tamaño determinado por numOfWords
.
.GetWordById(Integer id)
Recupera Word
con id
proporcionada de la tabla original_word_list.
.GetWordByName(String nameOfWord)
Recupera la primera Word
cuya propiedad word
es igual a nameOfWord
de la tabla original_word_list.
.WordValidator(String word)
Devuelve true
si la cadena dada está incluida en la columna de palabras en la tabla original_word_list; de lo contrario, se genera una excepción.
.setUniformProbabilities(List<Word> wordList)
Devuelve la lista de entrada de objetos Word
después de establecer la propiedad de probabilidad de cada Word
para que todos sean iguales y la suma sea la unidad. Como ejemplo, se devolverá una lista que consta de dos objetos Word
con probabilidades ambas establecidas en 0.5
.
.GenerateWordPattern(Word word, Word targetWord)
Devuelve un LinkedHashMap<String, String>
que representa el patrón obtenido al adivinar word
asumiendo que targetWord
es la respuesta. Como ejemplo, el patrón de Wordle que se muestra aquí estaría representado por el mapa:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
En general, las claves se indican con la letra seguida del índice que marca su posición en la palabra. Los valores toman tres valores "yellow"
, "green"
y "grey"
cada uno de los cuales representa el color de la letra en el patrón de Wordle.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Devuelve true
si word
y targetWord
pueden reproducir pattern
cuando se pasan como argumentos del método .GenerateWordPattern
. De lo contrario, se devuelve false
.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Devuelve una lista de objetos Word
que consta de palabras en wordList
que devuelven true
cuando se pasa como argumento targetWord
de .checkPatternMatch
. Aquí guess
y pattern
sirven como otros argumentos.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Para una guess
determinada, calcule un Double
cuyo valor represente la probabilidad de que se obtenga el pattern
dado. Esto se determina mediante la suma de las probabilidades de todos los objetos Word
en wordList
que devuelven true
cuando se ingresan como argumento targetWord
para .checkPatternMatch
.
.logTwo(Double value)
Devuelve el Double
cuyo valor es el log en base dos del argumento.
.computeWordScore(Word word, List<Word> wordList)
Calcula el promedio del número de veces que se espera que el tamaño wordList
se reduzca a la mitad al adivinar word
.
.computeScoreDistribution(List<Word> wordList)
Aplica el método .computeWordScore
a cada Word
en wordList
y establece la propiedad score
en el valor devuelto por el método. Luego se devuelve la lista resultante de objetos Word
.
getGuessesForAnswer(Answer answer)
Calcula el número de conjeturas que realiza el solucionador de Wordle para adivinar answer
. Luego, la answer
se devuelve con la propiedad machineResult
establecida en el valor calculado.
AnswerService
) Esta clase de servicio invoca la capa de acceso a datos para recuperar y actualizar objetos Answer
de la base de datos.
.getAllAnswers()
Devuelve una lista de todas las entradas en la tabla actual_answers como objetos Answer
.
.doesAnswerWithIdExists(Integer id)
Devuelve true
si el objeto Respuesta con la identificación existe en la tabla actual_answers
.getAnswerById(Integer id)
Devuelve el objeto Respuesta con la identificación correspondiente de la tabla actual_answers
.addAnswerToTable(Answer answer)
Toma el objeto Answer
y lo agrega a la tabla actual_answers
.deleteAnswerById(Integer id)
Elimina el objeto Answer
con la identificación correspondiente de la tabla actual_answers del argumento
.updateAnswerById(Integer id, Answer answer)
Actualiza el objeto Answer
con la identificación correspondiente de la tabla actual_answers con el objeto Answer
pasado como argumento
En esta sección, los POJO utilizados en el proyecto se enumeran junto con sus propiedades y la estructura JSON relacionada cuando se utilizan solicitudes POST y PUT:
Solicitud HTTP | Tipo | Función |
---|---|---|
Palabra | • ID entero • Palabra de cadena • Doble probabilidad • Doble puntuación | N / A |
Usuario | • ID entero • Nombre de cadena • Cadena de correo electrónico • Cadena de nombre de usuario | { "nombre": "Suad", "correo electrónico": "[email protected]", "userName": "SusuTheFlowerPot" } |
Respuesta | • ID entero • Fecha local Fecha de respuesta • Cadena respuesta del día • Resultados de la máquina de números enteros | { "dateOfAnswer": "2025-01-04", "answerOfDay": "cintura", "Resultado de la máquina": 3 } |
Juego | • ID entero • ID de usuario entero • Id. de respuesta entero • Conjeturas de usuario enteras | { "ID de usuario": 1, "ID de respuesta": 1, "usuarioAdivinado": 3 } |
Solicitud HTTP | Tipo | Función |
---|---|---|
localhost:8080/ayudante | CONSEGUIR | Obtenga todas las palabras. |
localhost:8080/ayudante/clasificado | CONSEGUIR | Obtenga todas las palabras clasificadas por puntuación. |
localhost:8080/ayudante/clasificado/{numOfWords} | CONSEGUIR | Obtenga todas las palabras clasificadas por puntuación y especifique cuántas palabras se obtuvieron. |
localhost:8080/ayudante/inicio | CONSEGUIR | Comienza el juego. Devolverá las mejores conjeturas ordenadas por puntuación. |
localhost:8080/helper/start/{palabra} | BORRAR | Ingrese su suposición para {palabra} e incluya el patrón que obtuvo de Wordle en el cuerpo de la solicitud como JSON (es decir, qué letras eran verdes, amarillas y grises). Ejemplo: { "f0": "amarillo", "o1": "amarillo", "o2": "verde", "d3": "gris", "s4": "verde" } |
localhost:8080/ayudante/final del juego | BORRAR | Termina el juego cuando obtienes la palabra correcta. |
Solicitud HTTP | Tipo | Función |
---|---|---|
localhost:8080/helper/wordbyid/{id} | CONSEGUIR | Obtenga identificación palabra por palabra. |
localhost:8080/helper/wordbyname/{nombredepalabra} | CONSEGUIR | Obtenga el nombre palabra por palabra. |
Solicitud HTTP | Tipo | Función |
---|---|---|
localhost:8080/competitive/computemachinescores | PONER | Requerido para ejecutarse como parte de la configuración del modo competitivo. Esto completará las conjeturas automáticas en la tabla actual_answers. |
localhost:8080/competitivo/todos | CONSEGUIR | Obtenga todos los juegos en la base de datos. |
localhost:8080/competitivo/addgame | CORREO | Agregue un nuevo juego (JSON) a la base de datos usando el cuerpo de solicitud. Ejemplo: { "ID de usuario": 1, "ID de respuesta": 1, "usuarioAdivinado": 3 } |
localhost:8080/competitivo/dailyresults/{fecha} | CONSEGUIR | Obtenga todos los resultados en la fecha determinada. |
localhost:8080/competitive/userresults/{nombre de usuario}/{fecha} | CONSEGUIR | Obtenga todos los resultados para la fecha indicada del nombre de usuario. |
localhost:8080/competitivo/resultados de usuario/{nombre de usuario} | CONSEGUIR | Obtenga todos los resultados para el nombre de usuario. |
localhost:8080/competitivo/averageresults/{nombre de usuario} | CONSEGUIR | Obtenga el promedio de las conjeturas de un usuario. |
localhost:8080/competitivo/inicio/{userId} | CONSEGUIR | Inicie un juego para un usuario con una identificación coincidente. |
localhost:8080/competitive/start/{userid}/{guess} | BORRAR | Ingrese la suposición del usuario en {guess}. Repita para cada conjetura hasta que se complete el juego. |
localhost:8080/competitive/start/{userid}/end | CORREO | Finalice el juego para el usuario y guarde el resultado en la base de datos. |
host local: 8080/usuario | CONSEGUIR | Obtenga todos los usuarios de la base de datos. |
localhost:8080/usuario/{ID de usuario} | CONSEGUIR | Obtener usuario de la base de datos por identificación. |
host local: 8080/usuario | CORREO | Agregue el usuario (JSON) a la base de datos usando el cuerpo de la solicitud. Ejemplo: { "nombre": "Suad", "correo electrónico": "[email protected]", "userName": "SusuTheFlowerPot" } |
Solicitud HTTP | Tipo | Función |
---|---|---|
localhost:8080/competitivo/{id} | PONER | Actualiza el juego (JSON) por id a través del cuerpo de solicitud. Ejemplo: { "ID de usuario": 1, "ID de respuesta": 1, "usuarioAdivinado": 3 } |
localhost:8080/competitivo/{id} | BORRAR | Eliminar juego por id. |
localhost:8080/competitivo/{id} | CONSEGUIR | Obtener juego por id. |
localhost:8080/respuestas | CONSEGUIR | Obtenga todas las respuestas. |
host local:8080/respuestas/{id} | CONSEGUIR | Obtenga una respuesta mediante ID de respuesta. |
localhost:8080/respuestas/addanswer | CORREO | Agregue una respuesta (JSON) usando el cuerpo de la solicitud. Ejemplo: { "dateOfAnswer": "2025-01-04", "answerOfDay": "cintura", "Resultado de la máquina": 3 } |
host local:8080/respuestas/{id} | BORRAR | Eliminar respuesta por id. |
localhost:8080/respuestas/actualización/{id} | PONER | Actualice la respuesta (JSON) por identificación usando el cuerpo de la solicitud. Ejemplo: { "dateOfAnswer": "2025-01-04", "answerOfDay": "cintura", "Resultado de la máquina": 3 } |
localhost:8080/usuario/{ID de usuario} | BORRAR | Eliminar usuario por id. |
localhost:8080/usuario/{ID de usuario} | PONER | Actualice el usuario (JSON) por identificación mediante el cuerpo de la solicitud. Ejemplo: { "nombre": "Suad", "correo electrónico": "[email protected]", "userName": "SusuTheFlowerPot" } |
¡Muchísimas gracias al equipo de BNTA y especialmente a nuestros entrenadores, Colin, Nelson e Iain!