Le scénario
Après une longue journée de travail au bureau et à parcourir le site stackexchange.com , j’ai finalement franchi la porte à 16h58, déjà fatiguée par la journée. Comme je ne suis encore qu’un stagiaire, mon moyen de transport actuel est le vélo. Je me dirige vers mon fidèle Peugeot Reynolds 501 , mais avant de pouvoir naviguer au-dessus, je dois le déverrouiller. La serrure est une serrure à combinaison à quatre chiffres standard (0-9) traversant le cadre et la roue avant. Alors que j'essaie de rester éveillé, je lève la main pour entrer dans la combinaison.
Le défi
Parce que mes doigts sont si fatigués, je veux que la serrure soit correctement assortie du moins possible de mouvements. Un mouvement est défini comme une rotation d'une position (36 degrés). Par exemple, il y a un mouvement de 5737
à 5738
. Cependant, je suis capable de saisir jusqu'à trois sonneries consécutives à la fois et de les faire tourner comme un seul , ce qui ne compte que pour un seul mouvement. Par exemple , il y a aussi un seul mouvement de 5737
la 6837
ou 5626
. Aller de 5737
à 6838
n'est pas un mouvement, car les chiffres 1, 2 et 4 ont évolué dans le même sens, mais indépendamment du chiffre 3.
Par conséquent, pour une combinaison donnée, je peux voir sur le cadenas du vélo (tout nombre entier à 4 chiffres), quel est le plus petit nombre de mouvements que je peux faire pour le déverrouiller, et oui, je peux effectuer une rotation dans n'importe quelle direction à tout moment. J'entends par là que je peux tourner certains chiffres dans une direction et d'autres chiffres dans l'autre direction: tous mes mouvements ne seront pas dans le sens contraire des aiguilles d'une montre ou dans le sens des aiguilles d'une montre pour chaque déverrouillage.
Parce que je suis paresseux, mon code de déverrouillage est 0000.
C’est du code golf, je ne me dérange pas pour écrire beaucoup de code, donc le programme le plus court en nombre d’octets gagne.
L'entrée est à partir de stdin, et votre code doit générer les combinaisons que je peux voir à chaque étape après chaque mouvement, y compris le 0000 à la fin. Chaque sortie des combinaisons doit être séparée par un espace / nouvelle ligne / virgule / période / esperluette.
Exemples
Input: 1210
0100
0000
Input: 9871
9870
0980
0090
0000
Input: 5555
4445&3335&2225&1115&0005&0006&0007&0008&0009&0000
Input: 1234
0124 0013 0002 0001 0000
J'ai essayé de poster ceci sur http://bicycles.stackexchange.com , mais ils ne l'ont pas aimé ...
Clause de non-responsabilité: Premier golf, donc tout ce qui est brisé / toute information manquante faites le moi savoir! De plus, j'ai fait tous les exemples à la main, il peut donc y avoir des solutions qui impliquent moins de mouvements!
EDIT: Pour les réponses qui ont plusieurs chemins de solution avec un nombre égal de mouvements (pratiquement tous), il n'y a pas de solution préférée.
Réponses:
Matlab,
412327 octetsGolfé (Merci à @AndrasDeak pour le golf
s
!):Ces codes utilisent une programmation dynamique pour trouver le "chemin" le plus court du nombre donné et
0000
utiliser uniquement les étapes possibles. Le défi est fondamentalement un prioblème de chemin le plus court (vous pouvez également envisager les étapes en tant que groupe commutatif), mais la difficulté consistait à trouver une mise en œuvre efficace . Les structures de base sont deux tableaux de 10000 éléments, l’un pour stocker le nombre d’étapes permettant d’atteindre cet index, l’autre pour stocker un pointeur sur le «nœud» précédent de notre graphique. Il calcule simultanément les "chemins" vers tous les autres nombres possibles.Exemples:
Code complet (avec quelques commentaires):
la source
6444
votre code, donne 6444 7554 8664 9774 0884 0994 0004 0003 0002 0001 0000, alors que je trouve que la réponse est 6444 6333 6222 6111 6000 7000 8000 9000 0000. Ma réponse est 8 étapes, la vôtre est 10. Je ne peux pas voir le question, et il semble être là à la fois dans la version golfée et non-golfée. Ceci est corrigé dans votre dernière édition.s
la dernière rangée devrait être[0,1,1,1]
. Ensuite, vous obtenez également une solution en 8 étapes! Je suis désolé pour le désagrément =)Lot - 288 octets
Même si vous avez dit qu'ils doivent être consécutifs (les anneaux), je suppose par logique (en suivant l'exemple) que je peux ignorer celui du milieu, de1234
à0224
.Ceci est ma solution de lot: 236 octets.Edit: solution corrigée
La nouvelle solution (corrigée en fonction des commentaires sous-jacents) est lourde de 288 octets.
la source
1234
à0224
n'est pas un mouvement. L'idée est que, avec seulement deux doigts, je peux saisir jusqu'à trois bagues consécutives avec une seule poignée.Haskell - 310 octets
Cela fonctionne en construisant de manière répétée une nouvelle liste de combinaisons en appliquant chaque tour possible à chaque combinaison déjà atteinte jusqu'à ce que l'une d'entre elles soit la bonne combinaison. Les doublons sont supprimés de la liste à chaque itération pour éviter que l'utilisation de la mémoire ne croisse de façon exponentielle.
En tant que solution de force brute, ceci est très inefficace et peut prendre plusieurs minutes à s'exécuter.
Je n'ai pas beaucoup d'expérience avec Haskell, donc quelque chose pourrait probablement être amélioré.
la source