Para el contexto, Wordle es un juego en el que tienes que descifrar una palabra de 5 letras en 6 o menos intentos basados en ciertas pistas. Las pistas que obtienes son las siguientes:
Estoy creando un programa de resolución de palabras que toma una variedad de intentos de palabras y los elimina de una lista de palabras posibles.
Siento que el mejor algoritmo para resolver este problema es una lista negra donde una palabra que rompe una de las reglas se elimina de la matriz. Pero si hay una alternativa mejor, estoy abierto a sugerencias.
const text = [ [ ["N","black"],["i","black"],["g","black"], ["h","black"],["t","green"] ], [ ["b","black"],["e","black"],["l","orange"], ["o","orange"],["w","black"] ] ] const words = "dozen,brave,apple,climb,outer,pitch,ruler,holds,fixed,costs,calls, ...etc" const solver = (text: any) => { this.resultingWords = words.split(",").filter(word => { word = word.toUpperCase() for (var i = 0; i < text.length; i++) { for (var j = 0; j < 5; j++) { let currentText = text[i][j] currentText[0] = currentText[0].toUpperCase() if (currentText[0] == '') { continue } if (currentText[1] == "green" && (word[j] != currentText[0])) { return false } if (currentText[1] == "black" && word.includes(currentText[0])) { return false; } if (currentText[1] == "orange" && (word[j] == currentText[0] || !word.includes(currentText[0]))) { return false } } } return true }) }El problema que tengo es si una palabra tiene múltiplos de la misma letra y uno de ellos es verde o naranja, pero el otro es negro. No obtengo resultados debido a la forma en que escribí mi algoritmo.
¿Cuál sería la forma de solucionar correctamente este problema?
¿Es un estilo de lista negra de filtrado la mejor solución? (a diferencia de la lista blanca).
Estás construyendo una lista de candidatos, creo que es un buen comienzo. Realmente no importa si pones en la lista blanca o negra, el resultado es la lista de candidatos. La única preocupación es que podría obtener la solución más rápido o de manera más confiable al adivinar palabras que no están en la lista de candidatos. ¿Por qué? Porque así puedes introducir más letras nuevas a la vez para comprobar si la palabra las contiene. Tal vez lo mejor sea una mezcla entre las dos estrategias, difícil de decir sin probarlo primero.
Hay muchas ideas para mejorar. Primero crearía el filtro antes de pasar por las palabras. Usando una lógica similar a la anterior, obtendría una colección de cuatro tipos de reglas diferentes: una letra tiene que estar o no puede estar en una posición específica o una letra tiene que aparecer exactamente (posiblemente 0) o al menos un número específico de veces. Luego revisa las palabras y filtra usando esas reglas. De lo contrario, algunos trabajos podrían realizarse varias veces. Es más fácil crear un filtro de este tipo recopilando las mismas letras en la suposición primero. Si hay un número exacto de regla de aparición, obviamente puede descartar un número mínimo de regla de aparición para la misma letra.
Para adivinar la palabra rápido, crearía una función de evaluación para encontrar la siguiente conjetura más prometedora entre los candidatos. Posibles valores a puntuar: