Problème
Supposons que vous ayez N piles nommées S 1 à S N , où chaque S k (k = 1 à N) contient N copies du nombre k.
Par exemple, lorsque N = 3, les piles ressemblent à ceci:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Ici, il y a 3 piles indexées comme 1, 2 et 3, et chacune contient N instances de son propre index.
Le but est de réorganiser les N piles de telle sorte que chacune d'entre elles contienne à l'identique les nombres 1 à N dans l'ordre de haut en bas.
Par exemple, pour N = 3, l'objectif est de réorganiser les piles en:
1 1 1
2 2 2
3 3 3
=======
1 2 3
La seule action que vous pouvez effectuer avec les piles est de prendre le numéro supérieur de l'une des piles (popping) puis de le placer immédiatement au-dessus d'une pile différente (pousser) . Ceci est soumis à ces stipulations:
Un nombre ne peut être poussé sur une pile que s'il est inférieur ou égal au numéro supérieur de cette pile.
Par exemple, un
1
peut être poussé sur une pile avec un1
,2
ou3
en haut, mais un2
ne peut être poussé que sur une pile avec un2
ou3
(ou plus) en haut.Cela a pour effet que les piles augmentent toujours de façon monotone de haut en bas.
Toute pile non vide peut être extraite de, et, en supposant que la puce précédente est satisfaite, toute pile peut être poussée vers.
Tout nombre peut être poussé sur une pile vide.
Les piles n'ont pas de limite de hauteur maximale.
Les piles ne peuvent pas être créées ou détruites, il y en a toujours N.
Ce défi consiste à décider des actions à effectuer et à effectuer afin de terminer l'échange de pile, pas nécessairement en un minimum de mouvements, mais de manière infaillible.
(S'entraîner avec un jeu de cartes est un bon moyen de se faire une idée du problème.)
Défi
Écrivez un programme ou une fonction qui accepte un entier positif N, garanti égal ou supérieur à 3. Affiche ou retourne une chaîne qui dénote toutes les actions pop-push nécessaires pour réorganiser les piles à partir de l'état initial:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(N = 5 cas)
À l'état final:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
Chaque ligne de votre sortie doit contenir deux nombres séparés par un espace. Le premier nombre est l'index de la pile à extraire et le deuxième nombre est l'index de la pile vers laquelle pousser. L'exécution des actions de toutes les lignes dans l'ordre doit organiser les piles correctement sans enfreindre aucune règle.
Par exemple, voici une sortie potentiellement valide pour le cas N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
Remarques
Votre sortie n'a pas besoin d'être optimale , seulement correcte. c'est-à-dire que vous n'avez pas besoin de minimiser le nombre de pops et de pushs.
- Donc, ce serait bien si, par exemple, des mesures étaient répétées et inversées immédiatement.
- Popping et pousser vers la même pile en un seul mouvement, par exemple
2 2
, est également autorisé (bien sûr inutile).
Votre sortie ne besoin d'être déterministe et fini.
N'oubliez pas que les piles ont une indexation basée sur 1. L'indexation basée sur 0 n'est pas autorisée.
N supérieur à 9 devrait bien sûr fonctionner aussi bien que le seul chiffre N.
Si vous le souhaitez, vous pouvez utiliser deux caractères ASCII imprimables non numériques distincts à la place des espaces et des retours à la ligne. Un retour à la ligne de fin (ou un substitut de nouvelle ligne) dans la sortie est très bien.
Notation
Le code le plus court en octets gagne. Tiebreaker est la réponse la plus votée.
Points sans valeur brownie si vous pouvez montrer que votre algorithme est optimal.
-._(._.)_.-
N=3
optimale?