Tengo un candado de combinación que tiene letras en lugar de números. Se ve así: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Hay 5 carretes, cada uno de los cuales tiene 10 letras diferentes.
A la mayoría de las personas les gusta usar una palabra para su combinación en lugar de una cadena arbitraria de letras. (Menos seguro, por supuesto, pero más fácil de recordar). Entonces, al fabricar el candado, sería bueno construirlo para tener una combinación de letras que se pueda usar para crear la mayor cantidad posible de palabras en inglés de 5 letras.
Su tarea, si elige aceptarla, es encontrar una asignación de letras a los carretes que permita crear tantas palabras como sea posible. Por ejemplo, su solución podría ser
ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ
(Si no te sientes demasiado imaginativo, eso es).
Para mayor coherencia, utilice la lista de palabras en http://www.cs.duke.edu/~ola/ap/linuxwords
Cualquier palabra de 5 letras en esa lista está bien, incluidos los nombres propios. Ignora Sino y L'vov y cualquier otra palabra en la lista que contenga un carácter no az.
El programa ganador es el que produce el mayor conjunto de palabras. En el caso de que varios programas encuentren el mismo resultado, gana el primero que se publique. El programa debería ejecutarse en menos de 5 minutos.
Editar: como la actividad ha disminuido y no han surgido mejores soluciones, ¡declaro a Peter Taylor el ganador! Gracias a todos por sus soluciones ingeniosas.
fuente
Respuestas:
1275 palabras por simple escalada codiciosa
El código es C #. La solución producida es
Estoy usando ese formato de salida porque es realmente fácil de probar:
fuente
Main
método para llamar a diferentes_Main
métodos.Python (3), 1273 ≈ 30.5%
Este es un enfoque realmente ingenuo: mantenga una cuenta de la frecuencia de cada letra en cada posición, luego elimine la "peor" letra hasta que las letras restantes quepan en los carretes. Me sorprende que parezca hacerlo tan bien.
Lo más interesante es que tengo casi exactamente la misma salida que la solución C # 1275, excepto que tengo un
N
último carrete en lugar deA
. EsaA
fue mi undécima y última eliminación, incluso antes de tirar aV
y aG
.Produce:
fuente
Mathematica , 1275 palabras una y otra vez ...
Este código no es Golfed ya que la pregunta no parece requerirlo.
El conteo de palabras rápidamente (menos de 10 segundos) evoluciona a 1275 en la mayoría de las carreras, pero nunca supera eso. Traté de perturbar las letras por más de una a la vez en un intento de salir de un máximo local teórico, pero nunca me ayudó. Sospecho firmemente que 1275 es el límite para la lista de palabras dada. Aquí hay una carrera completa:
Aquí hay algunas otras selecciones "ganadoras":
Como Peter comenta, en realidad son la misma solución en diferentes órdenes. Ordenados:
fuente
shortlist
siente largo, y aunque esto no es Golf, me gustaría algo más corto. ¿Puede usted ayudar?Python, 1210 palabras (~ 29%)
Asumiendo que conté las palabras correctamente esta vez, esto es un poco mejor que la solución de FakeRainBrigand. La única diferencia es que agrego cada carrete en orden y luego elimino todas las palabras de la lista que no coinciden con el carrete para obtener una distribución ligeramente mejor para los próximos carretes. Debido a esto, da exactamente el mismo primer carrete.
El programa sale
fuente
iPython (
273210 Bytes, 1115 palabras)1115/4176 * ~ 27%
Calculé esto en iPython, pero mi historial (recortado para eliminar la depuración) se veía así.
Si vamos para abreviar; Podría recortarlo para esto.
Acortado:
Mis resultados fueron los siguientes:
['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']
.* Mis matemáticas en el 4176 pueden ser un poco cortas debido a las palabras con guiones o apóstrofes que se omiten
fuente
Q
? (todo) palabras
Las palabras deben almacenarse en un archivo llamado
words
Se ejecuta en aproximadamente 170 ms en mi i7. Analiza la lista de palabras, buscando la letra más común en cada posición (obviamente filtrando a los no candidatos). Es una solución ingenua perezosa, pero produce un resultado razonablemente bueno con un código mínimo.
Resultados:
fuente
Editar: ahora que las reglas se han modificado, este enfoque está descalificado. Lo dejaré aquí en caso de que alguien esté interesado hasta que eventualmente lo modifique para las nuevas reglas.
Python: 277 caracteres
Estoy bastante seguro de que la versión generalizada de este problema es NP-Hard, y la pregunta no requería encontrar la solución más rápida , así que aquí hay un método de fuerza bruta para hacerlo:
Tenga en cuenta que cambié el nombre del archivo de lista de palabras a solo "w" para guardar algunos caracteres.
La salida es el número de palabras que son posibles de una configuración dada seguida de la configuración misma:
Se garantiza que la última línea de salida antes de que finalice el programa sea la solución óptima.
fuente