でパンケーキソートのみ許可される操作をシーケンスの一部の接頭辞の要素を逆にすることです。または、パンケーキのスタックを考えます。スタックのどこかにヘラを挿入し、スパチュラの上にすべてのパンケーキをひっくり返します。
たとえば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