Question
Nous sommes capturés par une armée de robots sur leur station spatiale. Notre pilote de vaisseau spatial est dans la prison qui est au niveau 1. Il n'y a qu'une seule façon de s'échapper et c'est de sauver votre pilote de vaisseau spatial. Cela signifie passer du niveau N au niveau 1. Cependant, parce que c'est très risqué, vous devez vous rendre à la prison dans le moins d'étapes possible.
Conditions
Il y a 4 façons de se déplacer:
- Passer du niveau N au niveau N - 1
e.g. from 12 to 11
- Passer du niveau N au niveau N + 1
e.g. from 12 to 13
- Utilisez la téléportation du niveau 2k au niveau k
e.g. from 12 to 6
- Utilisez la téléportation du niveau 3k au niveau k
e.g. from 12 to 4
- Passer du niveau N au niveau N - 1
Les téléports sont à sens unique (vous pouvez obtenir de 12 à 4 mais il est impossible d'obtenir de 4 à 12)
- Chaque action prend une étape
Contribution
L'entrée doit être lue depuis STDIN, ou l'alternative la plus proche dans votre langage de programmation. L'entrée se compose d'un entier n
où 1 <= n <= 10^8
.
Production
La sortie doit être le nombre minimum d'étapes nécessaires pour passer du n
niveau 1.
Exemples
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Essayez de coder un programme qui nous aidera à sauver notre pilote de vaisseau spatial de la prison dans les plus brefs délais et à rentrer chez nous!
Le code le plus court gagnera!
Réponses:
Pyth, 32 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
J'ai transformé un peu le problème. Je définis 4 nouvelles opérations, qui remplacent les 4 opérations de la question.
level / 2
(compte comme des(level % 2) + 1
étapes, car vous devrez peut-être d'abord descendre d'un niveau pour vous téléporter)(level + 1) / 2
(compte comme des(level % 2) + 1
étapes)level / 3
(compte comme des(level % 3) + 1
étapes)(level + 1) / 3
(compte comme des(-level % 3) + 1
étapes)De par sa conception ces opérations peuvent être appliquées à chaque numéro, si le nombre est
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
ou2 mod 3
.Vous pouvez facilement penser à pourquoi cela fonctionne. L'idée principale est qu'il existe au moins une solution optimale qui n'a pas deux mouvements (déplacer vers le bas) ou deux (déplacer vers le haut) d'affilée. Preuve: Si vous avez une solution, qui a deux de ces mouvements consécutifs, vous pouvez les remplacer et rendre la solution plus petite ou égale en longueur. Par exemple, vous pouvez remplacer (monter, monter, téléporter de 2k à k) par (téléporter de 2k à k, monter) et similaire dans tous les autres cas.
La fonction
y
utilise implicitement la mémorisation et donc le runtime n'explose pas.la source
Python, 176 octets
Force brute tout le long; une liste de tous les nombres
1 to 100,000,000
sur un ordinateur 64 bits représente environ 800 Mo de mémoire.L'index de la liste représente les nombres, les valeurs représentent la distance de 1 dans les étapes de sauvetage autorisées.
1
)0,2,2,3
)Le temps d'exécution est un peu plus de 10 minutes. * ahem *.
Commentaires sur le code
Autre
la source
Python 2 ... 1050
mal écrit, non golfé, non optimal.
Lit le niveau de démarrage sur stdin, imprime le nombre minimum d'étapes sur stdout.
la source
Code machine x86 32 bits, 59 octets
En hex:
Le langage machine n'a pas en soi de concept d'entrée standard. Étant donné que le défi est purement informatique, j'ai choisi d'écrire une fonction prenant le paramètre d'entrée
EAX
et retournant le résultatAL
.Le calcul du code est bien expliqué par @Jakube: la recherche n'est effectuée que parmi les chemins ayant des téléports entrecoupés de pas plus d'un mouvement à un niveau. Les performances sont d'environ 12 000 cas de test par seconde dans l'extrémité inférieure de la plage d'entrée et 50 cas par seconde dans l'extrémité supérieure. La consommation de mémoire est de 12 octets d'espace de pile par niveau de récursivité.
la source