Pour savoir ce qu'est la tour de Hanoi, recherchez-la sur Google ou regardez sur la page Wikipedia .
Votre code devrait pouvoir faire 2 choses, et ce sont les suivantes:
- Acceptez l'entrée utilisateur qui spécifie le nombre de disques au point de départ de la tour de Hanoi
- Créez une sortie de la manière de votre choix (tant qu'elle est en quelque sorte logique) pour montrer la solution au puzzle de la tour.
Un exemple de sortie logique serait le suivant (en utilisant un démarrage à 4 disques):
L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1
L
représente la cheville gauche, C
représente la cheville centrale et R
représente la cheville droite et les nombres indiquent jusqu'où déplacer le disque sur cette cheville et dans quelle direction. Les nombres positifs représentent le nombre de chevilles se déplaçant vers la cheville la plus à droite (car les disques commencent sur la cheville la plus à gauche).
Les règles de la tour de Hanoi sont simples:
- Un seul disque peut être déplacé à la fois.
- Chaque mouvement consiste à prendre le disque supérieur de l'un des piquets et à le faire glisser sur un autre piquet, au-dessus des autres disques qui peuvent déjà être présents sur ce piquet.
- Aucun disque ne peut être placé au-dessus d'un disque plus petit.
Les disques commencent sur la cheville la plus à gauche, le plus grand en bas, le plus petit en haut, naturellement.
Réponses:
Husk , 5 octets
Essayez-le en ligne!
Chacun
n
dans la sortie représente le déplacement du disquen
vers la prochaine cheville disponible (encapsulation cyclique).Explication
la source
Python, 76 caractères
Par exemple, pour N = 3, il renvoie:
la source
Perl - 54 caractères
Exécutez avec
perl -M5.010
et entrez le nombre de disques sur stdin.Format de sortie:
Une ligne par coup, le premier chiffre provient du piquet, le deuxième chiffre est du piquet (à partir de 0)
Exemple:
la source
$x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
GolfScript (
31 2524 caractères)Merci à Ilmari Karonen d'avoir souligné que mes
tr
permutations originales pourraient être raccourcies de 6 caractères. En les décomposant comme un produit de deux permutations, j'ai réussi à en sauver une de plus.Notez que la prise en compte de la
3%
longueur augmente d'un caractère:Certaines personnes ont des formats de sortie vraiment compliqués. Cela émet la cheville déplacée (numérotée 0, 1, 2) et la cheville déplacée vers. La spécification ne dit pas vers quelle cheville déplacer, elle se déplace donc vers la cheville 1.
Par exemple
la source
])~{.{3^3%}%2,@{2\-}%++}*
Perl, 75
79caractèresVolant totalement le format de sortie de Keith Randall:
Appelez avec
-M5.010
pour lesay
.(Je pense que cela peut être amélioré si vous pouvez trouver un moyen d'utiliser la valeur de retour de la fonction au lieu de simplement la supprimer.)
la source
say
recommandation "il suffit d'utiliser "]SML, 63
fonction d'appel
f(n,s,t)
avec:la source
Bash (64 caractères)
Publier celui-ci en dépit d'être plus de deux fois plus long que celui de GolfScript parce que j'aime la réutilisation de
t
pour servir deecho $s
.la source
Scala,
928887 caractèresFormat de sortie
Dites alors nombre de disque = 3,
la source
C,
989287 caractèresImplémente l'algorithme le plus trivial.
La sortie est sous la forme
ab ab ab
où chaque paire signifie "déplacer le disque supérieur de la cheville a vers la cheville b".EDIT : les mouvements sont maintenant encodés en hexadécimal - 0x12 signifie passer de la cheville 1 à la cheville 2. Sauvegardé quelques caractères.
EDIT : lit le nombre depuis stdin, plutôt que le paramètre. Plus court.
Exemple:
% echo 3 | ./hanoi
13 12 32 13 21 23 13
la source
h(x,printf(...))
est simplement un moyen d'appelerprintf
avant d'h
appeler. Le derniern++
est fait après leh
retour intérieur . Il sert à défaire l'initialen--
.;
serait la même chose ici.,
est souvent utile (par exempleif(x)a,b;
remplaceif(x){a;b;}
), mais n'a aucun avantage ici.Gelée , 5 octets
Essayez-le en ligne!
0
déplacer le plus petit disque d'un espace vers la droite (retour au début si nécessaire)1
déplacer le deuxième plus petit disque vers la seule autre colonne légale2
déplacer le troisième plus petit disque vers la seule autre colonne légale,etc.
Algorithme
Nous pouvons voir la solution du problème des tours de Hanoi récursivement; pour déplacer une pile de taille n de A à B , déplacer une pile de taille n -1 à partir de A à C , le disque de taille n de A à B , puis déplacer une pile de taille n -1 à partir de B à C . Cela produit un modèle de la forme suivante (dans le format de sortie utilisé par ce programme):
Nous pouvons observer que cette séquence est A007814 sur l'OEIS. Une autre définition possible de la séquence est "l' élément k ème (basé sur 1) de la séquence est le nombre de zéros à la fin du nombre k lorsqu'il est écrit en binaire". Et c'est ce que le programme calcule ici.
Explication
Tout d'abord, nous calculons le nombre de mouvements dans la solution, 2 n -1. Il s'avère être le plus court pour réellement calculer un coup supplémentaire et le jeter plus tard, c'est-à-
2*
dire 2 à la puissance de quelque chose. (La seule entrée que nous avons prise jusqu'à présent est l'argument de ligne de commande, de sorte qu'il est utilisé par défaut.)Ensuite, nous utilisons la fonction intégrée de Jelly pour calculer le nombre de zéros à la fin d'un nombre dans la base b ; c'est . Comme nous calculons en binaire, c'est . Tout ce que nous devons faire est d'appliquer ce code intégré aux nombres de 1 à 2 n -1 inclus.
ọb
ọ2
Il existe deux façons simples d'itérer sur une plage de nombres dans Jelly,
€
etR
, et mes tentatives précédentes sur ce problème en ont utilisé une. Cependant, dans ce cas, il est possible d'aller un peu plus court :,Ṗ
lorsque vous donnez un nombre en entrée, vous permettra de faire une itération qui arrête un élément court (en général,Ṗ
est une fonction intégrée utilisée pour traiter tout sauf un élément de quelque chose). C'est exactement ce que nous voulons dans ce cas (car il2*
génère un trop grand nombre d'éléments), donc l'utiliser pour établir un lien2*
etọ2
entrer2*Ṗọ2
nous donne une solution de 5 octets au problème.la source
Awk, 72 caractères
Le format de sortie est le même que celui de Keith Randall .
la source
Script bash,
10096 caractèresLe format de sortie est le même que celui de Keith Randall .
Modifier : Saved 4 caractères par peter commentaire s.
la source
$@
J, 23 octets
solution de nombres binaires
Cette solution utilise la méthode de comptage binaire décrite dans cette vidéo .
C'est-à-dire que je génère les chiffres binaires de
1
jusqu'à2^n
, puis prends des infixes de longueur 2 et compare chaque bit au bit correspondant du nombre précédent, et vérifie s'ils sont inégaux. Le nombre de bits inégaux est la sortie de ce mouvement.Sortie, par exemple, pour 3 disques, où le plus petit disque est étiqueté 1:
1
signifie "déplacer le plus petit disque d'une cheville vers la droite, en rebouclant sur la première cheville si nécessaire"n
, pour tous les autresn
, signifie "déplacer le disquen
vers une cheville légale" (il y en aura toujours exactement un)Essayez-le en ligne!
solution récursive
Même sortie que la solution ci-dessus, mais la logique ici rend la nature récursive du problème plus claire.
Le visualiser sous forme d'arbre souligne également ce point:
Essayez-le en ligne!
la source
APL (Dyalog Classic) , 19 octets
Essayez-le en ligne!
la sortie est une matrice à deux colonnes d'entiers en {0,1,2} - de la cheville à la cheville
la source
K (ngn / k) , 23 octets
Essayez-le en ligne!
la source
R , 73 octets
Mettre R sur la carte. Inspiré de [la réponse de Keith Randall] [1] avec une entrée simplifiée, n'imprimez que la fin et le début du rattachement pour économiser 2 octets. Également des chevilles indexées 0.
Essayez-le en ligne!
la source
JavaScript (ES6), 45b
Par exemple, appeler
h(4, 'A', 'B', 'C')
(déplacer 4 disques du piquet A au piquet C en utilisant le piquet auxiliaire B)Retour
'ABACBCABCACBABACBCBACABCABACBC'
(déplacer un disque du piquet A au piquet B, déplacer un disque du piquet A au piquet C, déplacer un disque du piquet B au piquet C, etc.)la source