Problem
Angenommen, Sie haben N Stapel mit den Namen S 1 bis S N , wobei jedes S k (k = 1 bis N) N Kopien der Zahl k enthält.
Wenn beispielsweise N = 3 ist, sieht der Stapel folgendermaßen aus:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Hier gibt es 3 Stapel, die als 1, 2 und 3 indiziert sind, und jeder enthält N Instanzen seines eigenen Index.
Das Ziel besteht darin, die N Stapel so neu anzuordnen, dass jeder von ihnen die Nummern 1 bis N in der Reihenfolge von oben nach unten enthält.
zB für N = 3 ist das Ziel, die Stapel neu anzuordnen in:
1 1 1
2 2 2
3 3 3
=======
1 2 3
Die einzige Aktion, die Sie mit den Stapeln ausführen können, besteht darin , die oberste Zahl von einem der Stapel zu nehmen (Poppen) und sie dann sofort auf einen anderen Stapel zu legen (Schieben) . Dies unterliegt diesen Bestimmungen:
Eine Zahl kann nur dann auf einen Stapel gelegt werden, wenn sie kleiner oder gleich der obersten Zahl auf diesem Stapel ist.
zB
1
kann a mit a1
,2
oder3
oben2
auf einen Stapel geschoben werden , aber a kann nur mit a2
oder3
(oder höher) oben auf einen Stapel geschoben werden .Dies hat zur Folge, dass Stapel von oben nach unten immer monoton ansteigen .
Jeder nicht leere Stapel kann aus dem Stapel entfernt werden, und unter der Annahme, dass der vorherige Aufzählungspunkt erfüllt ist, kann ein beliebiger Stapel in den Stapel verschoben werden.
Jede Zahl kann auf einen leeren Stapel gelegt werden.
Stapel haben keine maximale Höhenbeschränkung.
Stapel können nicht erstellt oder zerstört werden, es gibt immer N davon.
Bei dieser Herausforderung geht es darum, zu entscheiden, welche Aktionen ausgeführt werden müssen, um den Stapelaustausch abzuschließen, und zwar nicht unbedingt mit den wenigsten Zügen, sondern auf todsichere Weise.
(Das Üben mit einem Kartenspiel ist ein guter Weg, um ein Gefühl für das Problem zu bekommen.)
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl N (3 oder höher) enthält. Einen String drucken oder zurückgeben, der alle Pop-Push-Aktionen angibt, die erforderlich sind, um die Stapel aus dem Ausgangszustand neu anzuordnen:
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 Fall)
Zum endgültigen Zustand:
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
Jede Zeile in Ihrer Ausgabe muss zwei durch ein Leerzeichen getrennte Zahlen enthalten. Die erste Zahl gibt den Index des Stapels an, von dem aus die Daten abgerufen werden sollen, und die zweite Zahl gibt den Index des Stapels an, zu dem die Daten verschoben werden sollen. Durch Ausführen der Aktionen aller Zeilen in der angegebenen Reihenfolge sollten die Stapel korrekt angeordnet werden, ohne dass Regeln verletzt werden.
Hier ist zum Beispiel eine mögliche gültige Ausgabe für den Fall 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
Anmerkungen
Ihre Ausgabe muss nicht optimal sein , sondern nur korrekt. Das heißt, Sie müssen die Anzahl der Pops und Pushs nicht minimieren.
- Es wäre also in Ordnung, wenn zum Beispiel einige Schritte wiederholt und sofort rückgängig gemacht würden.
- Poppen und Schieben in einem Zug zum selben Stapel
2 2
ist ebenfalls erlaubt (obwohl natürlich sinnlos).
Ihre Ausgabe muss deterministisch und endlich sein.
Denken Sie daran, dass Stapel eine 1-basierte Indizierung haben. 0-basierte Indizierung ist nicht zulässig.
N größer als 9 sollte natürlich genauso gut funktionieren wie einstelliges N.
Falls gewünscht, können Sie anstelle von Leerzeichen und Zeilenumbrüchen zwei verschiedene, nicht einstellige druckbare ASCII- Zeichen verwenden. Eine abschließende Newline (oder Newline-Ersatz) in der Ausgabe ist in Ordnung.
Wertung
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist höher gestimmte Antwort.
Wertlose Brownie-Punkte, wenn Sie zeigen können, dass Ihr Algorithmus optimal ist.
-._(._.)_.-
N=3
optimal?