¿Cuál es la mejor estructura de datos para un solucionador de ahorcado?

El enfoque más común para jugar al Ahorcado es elegir primero las letras estadísticamente más comunes. Casi todos adivinan “E” primero.

Almacenaría las palabras en un árbol binario con el nodo superior que contiene todas las palabras que tienen la letra más común (‘E’) en la rama izquierda y todas las palabras que no contienen una ‘E’ en la rama derecha Luego, en la rama ‘E’, el siguiente nodo tendría todas las palabras que incluyen la segunda letra más común, que es ‘T’ (y ya sabemos que tienen una ‘E’) en la rama izquierda y todo de las palabras que no contienen una ‘T’ (pero obviamente tienen una ‘E’).

Trabaje en el árbol, y en cada nodo clasifique las palabras en dos grupos: las que contienen la letra restante más común y las que no.

Entonces, para cada movimiento del juego: adivina la letra de la rama izquierda y elimina la rama derecha si es una buena suposición o la rama izquierda si no lo es. Cuando llegas al pie del árbol, adivinas.

Me he simplificado un poco … cuando digo “la letra más común”, debo aclarar eso diciendo “la letra más común en las palabras que están en esta rama del árbol”. Entonces, por ejemplo, no desea adivinar “Q” si falla una suposición previa para “U”. A pesar de que Q es más común que Z en TODAS las palabras en inglés, no es probable que sea más común que Z en las palabras que le quedan al eliminar “U”.

Entonces, de la lista de palabras que te queda, elige la letra más frecuente.

Esto supone que la persona que configura el juego elige palabras en inglés al azar. Pueden ser astutos y elegir palabras deliberadamente sin E, T o A en ellas … en cuyo caso se requiere una estrategia diferente y todo el juego se trata de tratar de adivinar el vocabulario de la persona que elige.

Idealmente, lo que desearía es un mapa que filtre rápidamente un conjunto de cadenas para aquellos que coinciden con un patrón particular (y, de hecho, para la velocidad máxima, uno diferente de esos para cada longitud de palabra).

Sospecho que lo mejor que se puede usar aquí es una regex DFA personalizada construida previamente basada en el diccionario del ahorcado que se usa. Crear una estructura de este tipo lleva mucho tiempo, pero es muy rápido de usar.

La forma en que se usaría es construir una expresión regular que coincida con las restricciones que se conocen hasta ahora. Por ejemplo, si supieras

_ una _ _ _
Adivinado previamente: et

Buscarías la expresión regular

[^ et] a [^ et] {3}

Luego, podaría cualquier palabra no alcanzada por esta búsqueda desde el DFA, y finalmente recorrería los resultados y determinaría el carácter (contando como máximo uno de cada carácter por palabra) que aparece en la mitad más cercana de las palabras y adivina esa letra a continuación (o, si te estás quedando sin adivinanzas, elige la letra más común).

Repita hasta que llegue a su última suposición o la haya reducido a una sola palabra, luego elija al azar de las palabras restantes.

Para obtener aún más velocidad, precalcule su primera suposición. Por ejemplo, siempre adivine primero “e” y ya tenga DFA precalculados para “palabras con e” y “palabras sin e”.

More Interesting

¿Cuál es el mejor algoritmo de aprendizaje automático sin supervisión para la segmentación de imágenes basada en color?

¿Qué algoritmos se usan en los sistemas de recomendación?

Cómo fusionar dos arreglos ordenados

¿Cómo funciona la función Rolling Hash utilizada en el algoritmo Rabin Karp?

¿Las funciones de JavaScript como map (), reduce () y filter () ya están optimizadas para recorrer la matriz?

Soy un desarrollador de fuerza bruta, ¿cómo puedo mejorar mis habilidades de algoritmos?

¿Podría alguien explicar las etapas de un algoritmo recursivo que muestra cómo se alcanza la condición de terminación?

¿Por qué el método de ordenación Javascript organiza los números de una matriz en orden ascendente con [código] (a - b) [/ código] y descendente con [código] (b - a) [/ código]?

¿Cómo se determina la mejor, la media y la peor información dada sobre lo que devuelve un método después del bucle?

¿Dónde y cómo puedo aprender sobre la creación / comprensión de algoritmos de negociación de acciones?

Cómo implementar la generación de números aleatorios a nivel de hardware

¿Cuál es la forma más eficiente de representar una matriz binaria dispersa?

¿Qué es una explicación intuitiva de IDA * (profundización iterativa A *)?

¿Alguna vez ha enviado un artículo científico sobre un algoritmo que funciona tan bien como los métodos más modernos pero realmente no sabe por qué? ¿Puedes decir 'tal vez' al explicar tu método?

¿Cómo construir un algoritmo hash? ¿Dónde puedo aprender más?