でパンケーキソートのみ許可される操作をシーケンスの一部の接頭辞の要素を逆にすることです。または、パンケーキのスタックを考えます。スタックのどこかにヘラを挿入し、スパチュラの上にすべてのパンケーキをひっくり返します。
たとえば6 5 4 1 2 3
、最初の6
要素(シーケンス全体)を最初に反転し、中間結果を生成して3 2 1 4 5 6
から最初の3
要素を反転してに到達することにより、シーケンスをソートできます1 2 3 4 5 6
。
操作が1つしかないため、ソートプロセス全体を整数のシーケンスで記述できます。各整数は、pr flipを含める要素/パンケーキの数です。上記の例では、ソート順序はになります6 3
。
別の例:4 2 3 1
でソートできます4 2 3 2
。中間結果は次のとおりです。
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
タスク:
整数のリストを受け取り、有効なパンケーキソートシーケンスを出力するプログラムを作成します。
ソートするリストは、stdinからスペースで区切られたリスト、またはコマンドライン引数のいずれかです。リストを印刷しますが、多少読みやすい限りは便利です。
これはcodegolfです!
編集:
コメントで述べたように、出力を最適化する必要はありません(最短シーケンスを見つけるのはNP-hardです)。ただし、安価な解決策は、希望する結果([新しい?]タイプのbogosort)が得られるまで乱数を捨てることであることに気付きました。これまでの答えはどれもこれを行っていませんので、私はあなたのアルゴリズムが(擬似)ランダム性に依存してはならないことを宣言します。
あなたがすべて自分自身を蹴っている間、ここにそれをこするためのRuby 2.0のbogopancakesortバリアント(60文字)があります:
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
代わりに2番目の例を示します4 2 3 1