Supongamos que tiene una lista de palabras y desea poder usar tarjetas de letras para deletrear cada palabra. Por ejemplo, para deletrear gato , usarías tres cartas con la etiqueta C, A, T.
Suponiendo que cada tarjeta es de doble cara , envíe un programa para definir un número mínimo de tarjetas que se pueden usar para deletrear la lista completa de palabras.
La entrada es la lista de palabras, puede estar basada en archivos, codificada, línea de comando, lo que sea. La salida es la lista de tarjetas, formateadas y ordenadas como mejor le parezca, siempre que esté claro cómo se etiquetan las tarjetas.
El caso no es significativo: Golf, golf y GOLF son equivalentes.
Algunos consejos:
- el número de cartas no puede ser menor que la longitud de la palabra más larga
- no tiene sentido que una tarjeta tenga la misma letra en ambos lados
- Si bien el caso no es significativo, se recomienda utilizar minúsculas para aprovechar ciertas simetrías.
Ejemplos, estos aprovechan ciertas simetrías :
Entrada: ben, bog, bug, den, do, doe, dog, due, dug, Ed, end, gob, God, Ned, ode, pen, Poe, pug
Salida: b / d, e / g, o / n
Entrada: an, y, ape, are, be, bed, bud, bur, Dan, Deb, dub, ear, Ed, era, siesta, pan, guisante, pub, Rae, corrió, frotó
Salida: a / b, d / r, e / n
¡Haciéndolo un concurso de popularidad, por lo que la elegancia del código, el rendimiento en tiempo de ejecución y la astucia (incluyendo flexión de reglas y lagunas) son importantes!
Adición : Algunos han preguntado sobre las simetrías "permitidas", si se pueden usar fuentes especiales y si las tarjetas se pueden plegar.
Las simetrías permitidas son letras que se parecen entre sí después de 0, 90, 180 o 270 grados de rotación. Esto incluye b / q, d / p y n / u. También diría M / W, Z / N y, por supuesto, I / l (mayúscula i, minúscula L). Probablemente estoy rascando la superficie, así que si hay otros de los que no estés seguro, solo pregunta.
Para hacerlo simple, restrinja a una fuente sans-serif estándar, digamos que se usa en SE.
En cuanto al plegamiento, aunque puede hacer algunas sustituciones increíbles, por ejemplo, B puede ser D, E, F, I, P o R, y tal vez C o L si se pliega de manera realmente creativa, creo que eso es doblarse, literalmente, demasiado !
Se me ocurrió este problema mientras jugaba con algunas cartas similares con mis hijos. Noté lo fácil que era crear tarjetas de una cara versus lo difícil que era crear tarjetas de doble cara.
Adición : Han proporcionado una recompensa que se otorgará a la respuesta más popular. Si hay un empate, se otorgará al que presentó primero.
Otra pista:
- resolver el problema de una sola cara le dará una idea del número mínimo de tarjetas necesarias (por ejemplo, 20 tarjetas de una sola cara se traducen en al menos 10 tarjetas de doble cara necesarias)
Adición : Oh, molesta, estaba ocupado y olvidé la expiración de la recompensa. ¡Terminó yendo a nadie porque la única respuesta fue presentada antes de que comenzara la recompensa! Lo siento por eso.
n/u
,d/p
? ¿Qué hay deb/q
ym/w
? ¿Y quéP
pasa si doblo una tarjeta en dos para que se convierta la mitad superiorD
?Respuestas:
C # - CardChooser
Resumen
Esta aplicación utiliza un método de fuerza bruta para intentar resolver cada lista. Primero creo una lista de cartas potenciales para seleccionar, luego determino cuál es la mejor opción (elimina la mayoría de los caracteres + acorta la mayoría de las palabras largas), agrego esto a una lista de resultados y continúo con este proceso hasta que haya seleccionado suficientes cartas potenciales para eliminar cada palabra de la lista, luego vuelvo a unir esas tarjetas a cada palabra e imprimo la salida.
Si desea ver una versión más limitada de este código sin descargar y crear la aplicación de formularios de Windows proporcionada, puede usar el enlace proporcionado para ejecutar mi programa en conjuntos de datos más pequeños, tenga en cuenta que esta es la versión de la aplicación de consola, por lo que las tarjetas NO se giran: http://ideone.com/fork/VD1gJF
Revisión histórica
Actual: se agregó una mejor optimización de resultados sugerida por @Zgarb
Actualización 3: más limpieza de código, más errores corregidos, mejores resultados
Actualización 2 - Formularios de Windows, salida más detallada
Actualización 1 - Nuevo / Mejor soporte para simetrías de caracteres
Original - Aplicación de consola
Ejemplos
acr, popa, ain, sll, ganar, decir, decir, rápido, épico
hes, will, with, wont, would, wouldve, wouldnt, todavía, tú, youd, youll
aaaa, bbbb, cccc
Código
Todavía necesito combinar esto en un proyecto más grande con el código ConsoleApp y WindowsForms, todos compartiendo las mismas clases y métodos, luego dividir las diferentes regiones en el método RunButton_Click para poder escribir unidades a su alrededor, de todos modos cada vez que encuentre tiempo para hacerlo. Lo haré, por ahora esto es lo que tengo:
fuente
i
tarjeta?said
La última carta no es W o P