Pregunta
Somos capturados por el ejército robot en su estación espacial. Nuestro piloto de nave espacial está en la prisión, que está en el nivel 1. Solo hay una forma de escapar y está rescatando a tu piloto de nave espacial. Significa pasar del nivel N al nivel 1. Sin embargo, debido a que es muy arriesgado, debe llegar a la prisión en la menor cantidad de pasos posible.
Condiciones
Hay 4 formas de moverse:
- Pasar del nivel N al nivel N - 1
e.g. from 12 to 11
- Pasar del nivel N al nivel N + 1
e.g. from 12 to 13
- Usa el teletransporte del nivel 2k al nivel k
e.g. from 12 to 6
- Usa el teletransporte del nivel 3k al nivel k
e.g. from 12 to 4
- Pasar del nivel N al nivel N - 1
Los teletransportes son solo unidireccionales (puede obtener de 12 a 4 pero es imposible llegar de 4 a 12)
- Cada acción da un paso
Entrada
La entrada debe leerse desde STDIN, o la alternativa más cercana en su lenguaje de programación. La entrada consiste en un número entero n
donde 1 <= n <= 10^8
.
Salida
La salida debe ser el número mínimo de pasos necesarios para pasar n
al nivel 1.
Ejemplos
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
¡Intente codificar el programa que nos ayudará a salvar a nuestro piloto de nave espacial de la prisión en el menor tiempo posible y regresar a casa!
¡El código más corto ganará!
Respuestas:
Pyth, 32 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
Transformé el problema un poco. Defino 4 nuevas operaciones, que reemplazan las 4 operaciones de la pregunta.
level / 2
(cuenta como(level % 2) + 1
pasos, porque es posible que primero tengas que bajar un nivel para teletransportarte)(level + 1) / 2
(cuenta como(level % 2) + 1
pasos)level / 3
(cuenta como(level % 3) + 1
pasos)(level + 1) / 3
(cuenta como(-level % 3) + 1
pasos)Por diseño estas operaciones se pueden aplicar a cada número, si el número es
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
o2 mod 3
.Puedes pensar fácilmente por qué esto funciona. La idea principal es que hay al menos una solución óptima, que no tiene dos movimientos (hacia abajo) o dos (hacia arriba) en una fila. Prueba: si tiene una solución, que tiene dos de esos movimientos seguidos, puede reemplazarlos y hacer que la solución sea más pequeña o igual en longitud. Por ejemplo, podría reemplazar (subir, subir, teletransportarse de 2k a k) por (teletransportarse de 2k a k, subir) y similares en todos los demás casos.
La función
y
utiliza implícitamente la memorización y, por lo tanto, el tiempo de ejecución no explota.fuente
Python, 176 bytes
Fuerza bruta hasta el final; Una lista de todos los números
1 to 100,000,000
en una computadora de 64 bits es ~ 800Mb de memoria.El índice de la lista representa los números, los valores representan la distancia desde 1 en los pasos de rescate permitidos.
1
)0,2,2,3
)El tiempo de ejecución es un poco más de 10 minutos. *Ejem*.
Comentarios de código
Otro
fuente
Python 2 ... 1050
pobremente escrito, sin golf, no óptimo.
Lee el nivel de inicio en stdin, imprime el número mínimo de pasos en stdout.
fuente
Código de máquina x86 de 32 bits, 59 bytes
En hexadecimal:
El lenguaje de máquina per se no tiene concepto de entrada estándar. Como el desafío es puramente computacional, opté por escribir una función tomando el parámetro de entrada
EAX
y devolviendo el resultadoAL
.@Jakube explica muy bien la matemática detrás del código: la búsqueda se lleva a cabo solo entre los caminos que tienen telepuertos intercalados con no más de un movimiento de un nivel. El rendimiento es de aproximadamente 12000 casos de prueba por segundo en el extremo inferior del rango de entrada y 50 casos por segundo en el extremo superior. El consumo de memoria es de 12 bytes de espacio de pila por nivel de recursión.
fuente