Mi hija tenía la siguiente tarea para su tarea de matemáticas. Imagine seis amigos que viven en una línea, llamados E, F, G, H, J y K. Sus posiciones en la línea son las indicadas (no a escala) a continuación:
Por lo tanto, F vive cinco unidades de E, y dos unidades de G, y así sucesivamente.
Su tarea: cree un programa que identifique una ruta que visite a cada amigo exactamente una vez con una longitud total de n unidades, tomando las ubicaciones de los amigos yn como entradas. Debería informar la ruta si la encuentra (por ejemplo, para la longitud 17 podría informar "E, F, G, H, J, K", y debería salir con gracia si no existe una solución. Por lo que vale, completé una solución no adaptada en Mathematica en 271 bytes. Sospecho que es posible de manera mucho más concisa que eso.
fuente
[0, 5, 7, 13, 16, 17]
Y62
) para que pueda asegurarse de que no esté específicamente codificado en este caso."[0, 5, 7, 13, 16, 17], 62"
y una salida"(7, 16, 0, 17, 5, 13)"
?Respuestas:
J, 54 bytes
Emite una ruta correcta. Si no existe una ruta, no genera nada.
Código de 52 bytes que genera todas las rutas (una por línea):
Código de 38 bytes que genera posiciones en lugar de letras:
fuente
Mathematica, 55 o 90 bytes
Mathematica que dijiste? ;)
Esta es una función anónima que primero toma las posiciones de los amigos (en cualquier orden) y luego la longitud del objetivo. Regresa
Missing[NotFound]
, si no existe tal camino.Puedo guardar cuatro bytes si se permite devolver todas las rutas válidas (
FirstCase
->Cases
).Devolver una serie de cadenas es un poco más engorroso:
fuente
Z
continuará con los siguientes caracteres ASCII (de todos modos, no es que desee ejecutar mi código para n> 20: D).Python 2,
154148 bytes(o 118 bytes para la solución general)
Este programa acepta una línea con una lista y un número entero como '[0, 5, 7, 13, 16, 17], n' en stdin e imprime una ruta en la salida de longitud n o nada si es imposible.
Es un desafío escribir pequeños programas en Python que requieren permutaciones. Esa importación y uso es muy costoso.
La fuente del requisito de OP antes del minificador:
La solución general (no minificada):
Debido al algoritmo simple y al gran número de combinaciones, la ejecución de más de 20 posiciones iniciales será muy lenta.
fuente
from itertools import*
. Además, Python 3 podría ser más corto coninput()
y*a,c=map(...)
si puede funcionar con el resto de su programa.chr(a.index(n)+69)
?J (48 o 65)
Supongo que esto se puede jugar mucho más al golf. Siéntase libre de usar esto como un punto de partida para jugar más golf
O con letras:
Que hace:
(Espero que este formato de E / S esté bien ...)
Como lo hace:
Genera todas las permutaciones de la entrada.
Calcula la distancia
Ve qué resultados son los mismos que los de entrada y vuelve a generar esas permutaciones (sospecho que algunos caracteres se pueden eliminar aquí)
Con letras:
Cree una lista de las primeras n letras, donde n es la longitud de la lista de entrada
hace lo mismo que arriba
fuente
Octava, 73
Realmente no hay que deshacer el golf, así que déjenme tratar de explicarlo ... de adentro hacia afuera, permutamos todas las distancias, luego, para cada permutación, tomamos las diferencias entre las casas, tomamos el valor absoluto como una distancia, los sumamos arriba, encuentre el índice de la primera permutación con la distancia deseada, y permute las letras y encuentre esa permutación particular de letras.
que es 13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(en blanco para entradas imposibles)
fuente
perms()
en Octave 3.6.2 en ideone.com está teniendo problemas con el vector de cadenas.Matlab (86)
Ejemplo en el que existe una solución:
Ejemplo en el que no existe una solución:
Matlab (62)
Si el formato de salida se puede relajar produciendo posiciones en lugar de letras y produciendo una matriz vacía si no existe una solución:
Ejemplo en el que existe una solución:
Ejemplo en el que no existe una solución:
Matlab (54)
Si es aceptable que el programa proporcione todas las rutas válidas :
Ejemplo en el que existe una solución:
fuente
Haskell, 109 bytes
Ejemplo de uso:
17 # [0, 5, 7, 13, 16, 17]
que genera todas las rutas válidas, es decir["EFGHIJ","JIHGFE"]
. Si no hay una ruta válida,[]
se devuelve la lista vacía .La lista de letras incluye
I
(espero que esté bien).Cómo funciona: haga una lista de
(name, position)
pares, permute y tome aquellos donde la longitud del camino sea igualn
y elimine la parte de posición.fuente