ビル・ゲイツをアウトゴルフできますか?


13

パンケーキソーティングは、スパチュラをスタックの任意の位置に挿入して、その上にあるすべてのパンケーキを裏返すことができるときに、サイズの乱れたパンケーキのスタックをソートする数学的問題の口語的な用語です。パンケーキ番号P(n)は、n個のパンケーキに必要なフリップの最小数です。1

1979年、若いBill GatesとChristos Papadimitriouは、P(n)=(5n + 5)/ 3の上限を証明する論文を書きました。2

Gates(および/またはPapadimitriou)が開発したアルゴリズム(おそらく1979年以降)を使用してパンケーキソートを実行するプログラムを作成したと想定するのは安全だと思います。ゲイツは熟練したプログラマーだったので、おそらくこのコードをできる限りゴルフしようとしましたが、ソースコードのサイズは公開されていません(AFAIK)。

チャレンジ:

パンケーキのソートを実行する関数/プログラムを作成します。ここで、フリップの最大数は、GatesとPapadimitriouによって検出された境界を超えません。3リストが一貫している限り、リストを昇順または降順で選択できます。

n <50と仮定することができます。したがって、フリップの数を(ランダムに選択されたn値)に制限する必要があります。

 n   P(n)
38   65
49   83
50   85

出力は、各フリップの前のヘラの位置になります。出力は0または1のインデックスが付けられ、上からカウントするか下からカウントするかを選択できます。

追加のルール:

  • ランタイムは確定的でなければなりません
  • 固定の時間制限はありませんが、50要素のリストの出力を提供できる必要があります

テストリスト:

私は最も難しいリストを提供することはできません(もしそうなら、私は挑戦ではなく論文を書きます)、関数/プログラムをテストできる数のランダムなリストを提供します。これらのリストが「簡単」であることが判明した場合、他の人を追加できます。

9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21

うまくいけば、ビル・ゲイツとパパディミトリウがこの挑戦を見て、彼らのコードを提供して、あなたが実際にそれらを打ち負かしたかどうかを判断できるようにします。

3より良い上限が見つかりましたが、それらを気にする必要はありません。


関連しているが、重複していない。そこの答えはここでは機能しません。
スティーヴィーグリフィン

当時のソリューションでBFSを使用していましたが、ここで(わずかに更新して)動作し、フリップの数が最小のソリューションを見つける必要があります。
マイル

@milesはそれを投稿すること自由に感じます。私はすべての答えを詳しく説明しませんでしたが、ほとんどは単純なアプローチを使用しました。
スティーヴィーグリフィン

回答:


4

Python 2(PyPy)238 235 222バイト

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

*(2つのスペース=タブ)

オンラインでお試しください!

リストランク付けする方法を借りて、13バイトを節約しました。

ソート時に隣接する「パンケーキ」のペアがフリップによって分離されるかどうかをチェックする単純なヒューリスティックを備えたDFS。昇順にソートします。出力は左から0のインデックスが付けられ、0が最初の2を反転し、以下同様に続きます。使用される移動の数である(5/3)*n+1 < 5/3*(n+1)場合(18/11)*n < (5/3)*n+1 < 5/3*(n+1)(18/11)*nで緊密上限見出される2009

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