焦げたパンケーキの問題


23

この課題は、パンケーキの反転に関連しています。

パンケーキの並べ替えを聞いたことがあるかもしれません。パンケーキがプレート上で最小から最大に並べ替えられるまで、スパチュラをスタックに挿入し、スパチュラの上にあるすべてのパンケーキをひっくり返すことで、サイズによってパンケーキのスタックが並べ替えられます。焦げたパンケーキの問題は少し異なります。これで、すべてのパンケーキの片面が焼かれ、並べ替えが完了すると、各パンケーキの焼いた面がプレートに面する必要があります。

たとえば、次のスタックがある場合(左側のパンケーキのサイズ。右側が焼けた側を、右側が焼かれた側01意味します):

1 0
3 1
2 1

スタック全体を反転して取得し20 30 11、トップ2を31 21 11反転して取得し10 20 30、スタック全体を反転して取得します。焦げたパンケーキのソートされたスタックです。この一連の動き、フリップ3、フリップ2、フリップ3は、として表すことができます3 2 3

チャレンジ

  • パンケーキのサイズ(必ずしも一意ではない)の配列とその向きを指定して、有効な焼きパンケーキの並べ替え順序、つまり、焼き菓子の側面を下にしてパンケーキのスタックを最小から最大に並べ替える一連のフリップを出力します。
  • 入力と出力は、区切り文字を含む任意の健全な形式である場合がありますが、使用する形式を指定し、入力形式のどちらの端がスタックの最上部(TOS)であるかを指定してください。
  • ゼロのパンケーキの反転は許可されています。
  • 入出力でセパレーターを混在させることができます。

テストケース

以下のすべてのテストケースでは、入力はリストであり、出力はスペースで区切られた文字列であり、TOSは左側にあります。

[[1, 0], [3, 1], [2, 1]]
"3 2 3"

[[5, 1], [3, 0], [4, 1], [2, 1], [1, 0]]
"5 3 4 1 3 2 1"

[[5, 1], [3, 0], [3, 0], [1, 1]]
"4 3 2 3"

いつものように、何か不明確または間違っている場合は、コメントで知らせてください。幸運と良いゴルフ!

回答:


7

Python 2、83

入力は、スタックの一番上を最後に持つ(サイズ、方向)タプルのリストであることが期待されます。出力は、さまざまな種類の空白で区切られた反転するサイズのリストです。

a=input()
while a:i=a.index(max(a));print len(a)-i,a[i][1],len(a),i;a=a[i+1:]+a[:i]

2
どうやら私はばかです。
リーキー修道女

ある0許容出力リストに?
リーキー修道女

19
@LeakyNun 0個のパンケーキをひっくり返すことは非常に可能です。実際、私は今それをやっています。
-feersum

@danieroスタックの最上部は右側にあります。
リーキー修道女

@LeakyNunああ、ごめんなさい、
ダニーエロ

3

CJam(37バイト)

q~{__$W>#)_p/(W%\M*2,f.^+(1=p_,)pW%}h

入力は、stdinのCJam形式の配列です。出力は、stdoutのフリップ長の改行区切りリストです。スタックの最上部はindexにあり0ます。0焼け面が上を1示し、焼け面が下を示します。

オンラインデモ

解剖

出力は常に3n長く反転しnます。ここで、パンケーキの数です。最初に、残りの最大のパンケーキを上にひっくり返します。そして、それが焼けた側である場合、私たちはその1つのパンケーキをひっくり返します。そして、下にひっくり返し、パンケーキのスタックが1つ短いように繰り返します。

q~         e# Parse input into array
{          e# Loop...
  __$W>#)  e#   Find 1-based index of largest element in array
  _p       e#   Dup and print
  /(       e#   Split into chunks that long, and pull off the first
  W%       e#   Reverse the first chunk. Note that we don't flip the burnt/unburnt bit
  \M*      e#   Merge the remaining chunks into a single array
  2,f.^    e#   Flip *their* burnt/unburnt bits
  +        e#   Concatenate, prepending the first chunk
  (1=p     e#   Pull off the first (largest) element and print its burnt/unburnt bit
  _,)p     e#   Print the number of remaining elements plus 1 (to account for the largest)
  W%       e#   Reverse. Note that the first chunk has now been flipped twice, which is
           e#   why we have left its burnt/unburnt bit alone
}h         e# ... until we get down to an empty array

3

Ruby、101 95 93バイト

あまりゴルフ好きではないので、ボゴソートのバリエーションを作りたかっただけです。これは、配列の配列を受け取り、パンケーキがソートされるまでランダムなフリップを標準出力に出力する匿名関数です。

->a{(p r=-~rand(a.size)
a[0,r]=a[0,r].reverse.map{|x,b|[x,1-b]})while a!=a.sort||a.rassoc(1)}

たとえば、それを割り当ててf言うことができますf.call [[1, 0], [3, 1], [2, 1]]

rassoc
@ Sherlock9から-2バイトを使用して、@ Jordanから-5バイト


1
あなたは置き換えることによって、数バイトを保存することができa.all?{...}!a.rassoc(1)
ヨルダン

@ジョルダンうわー、それは本当に素晴らしいです!(r)を使用することを考えたことがありませんassocが、それについて考えると、おそらくこのサイトの多くの問題で役立つでしょう-Rubyゴルフのヒントの投稿に行くべきだと思います。とにかく、ありがとう:)また、deMorgansの法則を適用してに置き換えることuntilで、別のバイトを殺すことができましたwhile
-daniero


bisは0or のみなので11-b動作し、2バイトを節約します。
Sherlock9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.