Programa para formar palabras con letras

Palabras con letras equilibrio

Actualmente soy un estudiante de Ciencias de la Computación AP. He estado trabajando en un descifrador de letras que lee en un diccionario e imprime una lista de palabras posibles con el conjunto de letras introducido. Para ello hago un mapa con Map<String,Set<String>>
Una forma sería incrementar continuamente un número donde los bits del número representan las letras de su grupo. Por ejemplo, para “tierra”, pasaría por todos los números de 5 bits no nulos, contando del 1 al 31. El bit 0 podría representar la “e” o la “h”; realmente no importa. Sólo hay que ser coherente.
En cada paso, encuentra los bits establecidos, y selecciona las letras correspondientes de tu grupo. Ese es uno de los posibles subgrupos. (Puede que necesites usar un HashSet o algo así para eliminar duplicados… por ejemplo si tu grupo tiene 2 “e” o algo así). Así que para “tierra”, 1 podría ser “e”, 2 podría ser “a”, 3 sería “ea”, 4 sería “r”, y así sucesivamente.

Palabras de 5 letras de across

Aquí hay una pista para que empiece a ir por el buen camino: ni siquiera considere usar std::next_permutation a menos que sea algo que sólo vaya a usar una o dos veces (y probablemente ni siquiera entonces, porque en realidad es más complicado que hacer el trabajo bien).
Usando std::next_permutation, su función será aproximadamente N! veces más lenta de lo necesario1 — en el caso de 5 letras, eso será 120 veces más lento, y si alguna vez usa palabras más largas, empeorará muy rápidamente (por ejemplo, para 10 letras es más de 3,5 millones).
En su lugar, comience por preprocesar su diccionario. En lugar de un std::set<std::string> de palabras, cree un std::map<std::string, std::vector<string>> (o std::unordered_map, aunque el inglés tiene suficientes palabras como para que esto no suponga una gran diferencia). Cuando lea una palabra del diccionario, cree una versión ordenada de esa cadena. Utiliza esa versión como clave y coloca la versión original de la palabra en el vector correspondiente a esa clave.
1. Si usas std::map en lugar de std::unordered_map, debería ser algo así como N!/(log N), pero N! crece tan rápido y log N crece tan lentamente que la diferencia es insignificante (si consigues que N sea lo suficientemente grande como para que log N = 3, N! será tan grande que los pasos de cálculo de N!/log N… bueno, empiezas a entrar en cuestiones de cosmología, como si el universo habrá muerto de muerte por calor antes de eso (a lo que la respuesta parece ser “sí, probablemente”).

Descifrador de palabras

La letra E fue escrita tanto en el campo de la letra como en el campo del patrón, lo que puede llevar a resultados con hasta dos E’s dentro. Asegúrese de no utilizar letras que no tenga a su disposición.Hacer palabras a partir de letras y puntosEl segundo tipo de carácter que se puede utilizar para hacer palabras a partir de letras es el punto (.). Un solo punto marca un campo vacío opcional y representa las posibles letras de las palabras que desea crear. Tenga en cuenta que si utiliza patrones, los resultados no serán más largos que el número de caracteres que haya introducido en el campo del patrón. Por lo tanto, asegúrese siempre de utilizar muchos puntos aquí. Si no escribes nada en el campo del patrón, no hay una longitud máxima para las palabras descifradas.
Si quiere crear palabras a partir de letras que consistan exactamente en cuatro letras, utilice cuatro puntos en el campo de patrón, representando una letra con cada punto.Para obtener información más detallada sobre cómo utilizar el campo de patrón, eche un vistazo a este tutorial sobre el uso de patrones.Sin Patrón – Haga palabras sólo con estas LetrasDeje el campo de patrón de nuestro Creador de Palabras vacío y las palabras se harán exclusivamente a partir de las letras que haya escrito en el campo de letras. Por favor, tenga en cuenta que hay un límite de 15 caracteres que puede teclear.Sí Patrón – Hacer palabras a partir de Letras usando CaracteresLos Caracteres que puede usar en el campo de patrón son PUNTOS simples, que representan campos opcionales vacíos. También puede escribir LETRAS, por supuesto, y, por último, NÚMEROS para representar campos de bonificación en los juegos de palabras.Uso de puntos, letras y números en el campo de patrónLos puntos (.) representan campos vacíos opcionales que indican la posible longitud de las palabras.

Encuentra palabras con estas letras

He aquí una pista para que empiece a ir por el buen camino: ni siquiera considere usar std::next_permutation a menos que sea algo que sólo vaya a usar una o dos veces (y probablemente ni siquiera entonces, porque en realidad es más complicado que hacer el trabajo bien).
Usando std::next_permutation, su función será aproximadamente N! veces más lenta de lo necesario1 — en el caso de 5 letras, eso será 120 veces más lento, y si alguna vez usa palabras más largas, empeorará muy rápidamente (por ejemplo, para 10 letras es más de 3,5 millones).
En su lugar, comience por preprocesar su diccionario. En lugar de un std::set<std::string> de palabras, cree un std::map<std::string, std::vector<string>> (o std::unordered_map, aunque el inglés tiene suficientes palabras como para que esto no suponga una gran diferencia). Cuando lea una palabra del diccionario, cree una versión ordenada de esa cadena. Utiliza esa versión como clave y coloca la versión original de la palabra en el vector correspondiente a esa clave.
1. Si usas std::map en lugar de std::unordered_map, debería ser algo así como N!/(log N), pero N! crece tan rápido y log N crece tan lentamente que la diferencia es insignificante (si consigues que N sea lo suficientemente grande como para que log N = 3, N! será tan grande que los pasos de cálculo de N!/log N… bueno, empiezas a entrar en cuestiones de cosmología, como si el universo habrá muerto de muerte por calor antes de eso (a lo que la respuesta parece ser “sí, probablemente”).

Santiago Paez