Dada una secuencia de números, encuentre el número mínimo de saltos para ir desde la posición inicial hasta el final y volver a la posición inicial nuevamente.
Cada elemento de la secuencia denota el número máximo de movimientos que uno puede mover desde esa posición.
En cualquier posición, puede hacer un salto de al máximo k movimientos, donde k es el valor almacenado en esa posición. Después de llegar al final, puede usar solo aquellas posiciones para saltar que no se hayan usado previamente para saltar.
La entrada se dará como una secuencia de números separados por espacios individuales. La salida debe ser un número único, que es el número mínimo de saltos utilizados. Si no es posible ir al final y volver a la posición inicial, imprima -1
Entrada:
2 4 2 2 3 4 2 2
Salida:
6 (3 para llegar al final y 3 para volver)
Entrada
1 0
Salida
-1
Nota
- Suponga que todos los números de la secuencia no son negativos
EDITAR 1
La línea "Por lo tanto, debe quedar claro que siempre se puede saltar desde la última posición". puede ser confuso, así que lo eliminé de la pregunta. No tendrá ningún efecto en la pregunta.
Criterios ganadores:
El ganador será el que tenga el código más corto.
fuente
Thus, it should be clear that one can always jump from the last position.
- ¿No es1 0
un contraejemplo?Respuestas:
APL (Dyalog), 116
Casos de prueba
Acercarse
El enfoque es una búsqueda de fuerza bruta utilizando una función recursiva.
Comenzando desde la posición 1, establezca el valor en la posición actual en 0 y genere una matriz de las posiciones a las que se puede saltar desde la posición actual. Pase la nueva posición y la matriz modificada a sí mismo. Los casos base son cuando el valor en la posición actual es 0 (no se puede saltar) o llega al final.
Luego, para cada uno de los arreglos generados, inviértalo y realice la búsqueda nuevamente. Debido a que las posiciones saltadas se establecen en 0, no podemos saltar desde allí nuevamente.
Para aquellos arreglos que llegamos al final, encuentre los que tienen el número mínimo de 0. Restando de él, el número de 0 en la matriz inicial da el número real de saltos realizados.
fuente
Mathematica,
197193caracteresFuerza bruta.
fuente
Mathematica 351
[Nota: Esto aún no está totalmente golfizado; Además, la entrada debe ajustarse para ajustarse al formato requerido. Y la regla de no saltar en la misma posición dos veces debe implementarse. También hay algunos problemas de formato de código que deben abordarse. Pero es un comienzo.]
Se construye un gráfico con nodos correspondientes a cada posición, es decir, cada dígito de entrada que representa un salto.
DirectedEdge[node1, node2]
significa que es posible saltar del nodo1 al nodo 2. Las rutas más cortas se encuentran de principio a fin y luego de principio a fin.Uso
fuente
Python 304
Creo que este nuevo enfoque resuelve (¡espero!) Todos los problemas relacionados con el caso [2,0] y similares:
En esta versión, la secuencia de entrada se atraviesa (si es posible) hasta el final y luego comenzamos el proceso nuevamente con la secuencia invertida. Ahora podemos garantizar que para cada solución válida, uno de los saltos cae en el último elemento.
Estas son las versiones de golf:
Y algunos ejemplos:
fuente
R - 195
Simulación:
De-golf:
fuente
Python 271
Esta es mi solución:
Ejemplos:
Y estas son las versiones de golf (en parte por ahora):
Algunos ejemplos:
fuente
Rubí - 246
Simulación:
fuente
Ruby: unos 700 jugadores de golf. Comencé una versión de golf, con nombres de un solo carácter para variables y métodos, pero después de un tiempo me interesé más en el algoritmo que el golf, así que dejé de intentar optimizar la longitud del código. Tampoco me preocupé por obtener la cadena de entrada. Mi esfuerzo está abajo.
Para ayudarlo a comprender cómo funciona, he incluido comentarios que muestran cómo se manipula una cadena en particular (u = "2 1 4 3 0 3 4 4 3 5 0 3"). Enumero combinaciones de "rocas en la corriente" que están disponibles para subir. Estos se representan con una cadena binaria. Doy el ejemplo 0b0101101010 en los comentarios y muestro cómo se usaría. Los 1 corresponden a las posiciones de rocas disponibles para el viaje inicial; los 0 para el viaje de regreso. Para cada asignación, uso la programación dinámica para determinar el número mínimo de saltos requeridos en cada dirección. También realizo algunas optimizaciones simples para eliminar algunas combinaciones desde el principio.
Lo ejecuté con las cadenas dadas en otras respuestas y obtuve los mismos resultados. Aquí hay algunos otros resultados que obtuve:
Me interesaría saber si otros obtienen los mismos resultados para estas cadenas. El rendimiento es razonablemente bueno. Por ejemplo, tardó menos de un minuto en obtener una solución para esta cadena:
"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1"
El código sigue.
fuente
Haskell,
173166 bytes, 159 bytes de GHCiAquí está la versión normal:
importar datos Lista
Aquí está la respuesta de GHCi (ponga la línea de una en una):
Solo una fuerza bruta. Genera la posible respuesta. (es decir, la permutación de [0..n-1] con cero y el elemento siguiente descartado. Luego verifique si la respuesta es correcta. Obtenga la longitud mínima y agregue por uno. (Dado que los ceros iniciales y finales se eliminan).
Cómo usar:
j[3,4,0,0,6]
->3
fuente
Data.List.permutations
no funciona en GHC, sino solo en GHCi. De acuerdo con nuestra Guía de reglas de golf en Haskell , debe agregar la importación o marcar su respuesta como "Haskell GHCi". La primera opción es generalmente preferida por los golfistas de Haskell en este sitio.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
, puedes escribirf<-map(takeWhile(/=0))(permutations[0..t l-1])
, que de nuevo se puede jugarf<-fst.span(>0)<$>permutations[0..t l-1]
. Con esto, vuelve a 166 bytes incluso agregando la importación: ¡ Pruébelo en línea!