問題
あなたはNが持っていると言うスタック Sという名前の1 Sを通じてNそれぞれのS、K(Nへのk = 1)は数kのN個のコピーが含まれています。
たとえば、N = 3の場合、スタックは次のようになります。
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
ここでは、1、2、および3のインデックスが付けられた3つのスタックがあり、各スタックには独自のインデックスのN個のインスタンスが含まれています。
目標は、各スタックが上から下に順番に1からNまでの数字を含むように、Nスタックを再配置することです。
たとえば、N = 3の場合、目標はスタックを次のように再配置することです。
1 1 1
2 2 2
3 3 3
=======
1 2 3
スタックで実行できる唯一のアクションは、スタックの1つからトップ番号を取得(ポップ)し、すぐに別のスタックのトップに配置(プッシュ)することです。これはこれらの規定に応じてあります:
数値は、スタックの一番上の数値以下である場合にのみスタックにプッシュできます。
空でないスタックはポップされ、前の弾丸が満たされたと仮定して、スタックがプッシュされます。
任意の数を空のスタックにプッシュできます。
スタックには最大の高さ制限はありません。
スタックは作成または破棄できません。常にN個あります。
この課題は、スタック交換を完了するためにどのポップとプッシュを行うかを決定することであり、必ずしも最小限の移動ではなく、確実な方法で行います。
(カードのデッキで練習することは、問題を感じる良い方法です。)
チャレンジ
3以上であることが保証されている正の整数Nを取り込むプログラムまたは関数を作成します。スタックを初期状態から再配置するために必要なすべてのポッププッシュアクションを示す文字列を出力または返します。
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ケース)
最終状態へ:
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
出力の各行には、スペースで区切られた2つの数字が含まれている必要があります。最初の数値はポップするスタックのインデックスで、2番目の数値はプッシュするスタックのインデックスです。すべての行のアクションを順番に実行すると、ルールを破らずにスタックを正しく配置する必要があります。
たとえば、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
ノート
出力は最適である必要はなく、正しいだけです。つまり、ポップとプッシュの数を最小限にする必要はありません。
- それで、例えば、いくつかの動きが繰り返し行われ、すぐに逆になれば大丈夫でしょう。
- 同じスタックへの1回の移動でのポップとプッシュ
2 2
も許可されます(もちろん無意味ですが)。
出力は確定的で有限である必要があります。
スタックには1ベースのインデックス付けがあることに注意してください。0から始まるインデックスは許可されていません。
9より大きいNはもちろん、1桁のNと同じように機能します。
必要に応じて、スペースと改行の代わりに、数字以外の印刷可能なASCII文字を2つ使用できます。出力の末尾の改行(または改行置換)は問題ありません。
得点
バイト単位の最短コードが優先されます。Tiebreakerは、より高い投票数の回答です。
アルゴリズムが最適であることを示すことができれば、価値のないブラウニーポイント。
-._(._.)_.-
N=3
最適な場合に含めることができる出力はありますか?