Este es un rompecabezas de palabras.
Su programa debe aceptar dos palabras en la entrada estándar.
La palabra uno es la palabra de inicio. La palabra dos es la palabra final.
Desde la palabra inicial, debe llegar a la palabra final cambiando / agregando / eliminando una letra a la vez. Después de cada modificación, debe formar una nueva palabra válida. Las letras agregadas se agregan al principio o al final. Puede eliminar letras de cualquier ubicación (pero la palabra no debe caer debajo de tres letras de longitud). Nota: No puede reorganizar las letras para formar una palabra.
La salida del programa es la secuencia de palabras para llegar desde la palabra inicial hasta la final.
Ejemplo:
Input:
Post Shot
Output:
Post
cost
coat
goat
got
hot
shot
Ganador:
- El programa debe ejecutarse en un tiempo razonable (menos de 10 segundos).
- El programa que puede generar la secuencia de salida más corta para las palabras premiadas.
- Zink -> Silicio
- Si más de un programa obtiene la secuencia más corta, entonces el programa más corto en caracteres (ignorando el espacio en blanco).
- Si todavía tenemos más de una fecha / hora de presentación del programa se utilizará.
Notas:
- La capitalización no es relevante.
- El código para construir un diccionario no cuenta para el costo del código.
- Las palabras y la secuencia del premio se generarán a partir de:
http://dl.packetstormsecurity.net/Crackers/wordlists/dictionaries/websters-dictionary.gz
- Las palabras y la secuencia del premio se generarán a partir de:
code-golf
word-puzzle
Martin York
fuente
fuente
Respuestas:
Python, 288 caracteres
(sin contar la línea de lectura del diccionario)
para el desafío
zink
desilicon
:Hay algunas palabras extrañas en ese diccionario ...
fuente
guester overturn
(toma un tiempo) oregatta gyrally
(no regresa) ;-)traceroute - 10 caracteres
detalle
Los enrutadores están preconfigurados con OSPF habilitado y organizado de esta manera.
Y sí, necesito 233614 enrutadores para admitir completamente todas las palabras. :-)
fuente
zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->silicon
realmente estoy tratando con el algoritmo Dijkstra (que se usa en OSPF) y puede encontrar esa ruta alrededor de 1s, lo haré publícalo en una publicación separada más tarde, una vez que haya jugado golf.PHP -
886689644612Carga de diccionario:
Código real (solo concat ambos):
uso:
Resultado:
Esto debería ejecutarse en menos de 0.5 segundos para 'Zink Silicon', y menos de 1 segundo para la mayoría de los casos (a veces más tiempo cuando no existe una solución, pero aún así regresa).
Esto utiliza el algoritmo A * con distancia levenshtein para estimar los límites inferiores de las distancias.
Algunas pruebas interesantes:
vas arm
->vas bas bar barm arm
(con una palabra más larga que inicio y fin)oxy pom
->oxy poxy poy pom
regatta gyrally
-> (ninguno, pero el script termina correctamente)aal presolution
-> +8 caractereslenticulated aal
-> -9 caracteresacarology lowness
-> 46 saltoscaniniform lowness
-> 51 saltoscauliform lowness
-> 52 saltosoverfoul lowness
-> 54 saltosdance facia
-> algunas palabras en el camino tienen 4 caracteres más que ambos inicio / finfuente
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
php -dmemory_limit=256M
.had->hand
no es un movimiento válido, solo puede agregar una letra al principio o al final. Lo mismo paravest->verst
:-)Pitón
Como no pude jugar golf en los códigos dijkstra para comprimir a unos pocos cientos de bytes, aquí hay una versión mía sin golf.
Pruebas
Se agregaron las pruebas de user300
Algo mas
fuente
3 <= len(x) <= max(map(len, [nodea, nodeb]))
¿está garantizado que el camino nunca atravesará una palabra más que las palabras de inicio y fin?oxy pom
; camino más corto esoxy->poxy->poy->pom
. También parece que permite permutaciones e inserciones en cualquier lugar, que no están permitidas :-)