オーバーハンドシャッフルの分析


13

ロッドは、ジョージとティムの2人のプレイヤーの間でカードゲームをモデレートしています。現在、ティムはカードをシャッフルしています。ロッドは、ティムが不正行為をしようとしているのではないかと疑っています。

ティムはオーバーハンドシャッフルを行っています。彼はデッキの底からカードの山を切り取り、次に山の上部からデッキの上部にさまざまな部分を切り取り、そのプロセスを数回繰り返します。

ロッドはイーグルアイで、ティムが毎回何枚のカードをカットしているかを正確に見ることができますが、ティムがシャッフルするほど速くカードを計算して追跡することはできません。ここであなたがやって来ます:Rodは、詳細なシャッフル情報を取得し、シャッフルが公正か、弱いか、またはトリックかを判断するプログラムまたは関数を作成することを望んでいます。

  • シャッフルした後、隣接するカードが25ペア未満(同じ順序で)残っている場合、シャッフルは公平であり、ゲームを続行できます。
  • 隣接するカードの少なくとも25組(ただしすべてではない)が隣接している場合、シャッフルは弱くなり、ロッドはティムを頭の上で弾き、さらにシャッフルするように頼みます。
  • すべてのカードが最後に同じ位置に残っている場合、ティムは明らかに不正行為であり、ロッドは大きなマスで彼を叩きます。

これはコードゴルフなので、最短のコードが勝ちます。

入力:

いくつかの行で、スペースで区切られた0〜52(両方とも排他的)の一連の数字を取得します。各行は、すべてのカードを積み重ねて開始および終了するシャッフルのラウンドを表します。

各行の最初の数字は、ティムがデッキの下部からカットしたカードの数であり、後続の各数字は、手からデッキの上部にドロップするカードの数です。ラインの最後の番号の後にカードが残っている場合は、ティムがそれらをデッキの一番上に置いたと想定する必要があります。

入力は有効であることが保証されています。少なくとも1行の数字があり、各行には少なくとも2つの数字が含まれています。各行の最初の数値は、同じ行の他のすべての数値の合計より小さくありません。末尾の改行はオプションです。入力に1つがあると仮定することも、入力がないと仮定することもできます。

出力:

プログラムは、シャッフルが公正な場合は「公平」、シャッフルが弱い場合は「弱」、ティムがすべてのカードを同じ順序に維持している場合は「トリック」を印刷または返す必要があります。末尾の改行はオプションです。

例:

このデッキには52枚のカードがあると想定されていますが、デモのために、10枚の小さなデッキを使用します。

入力:

5 3 1
4 2 2

上から見た初期デッキ:0 1 2 3 4 5 6 7 8 9
50 1 2 3 45 6 7 8 9手で)
35 6 7 0 1 2 3 48 9手で)
18 5 6 7 0 1 2 3 49手で)
行の末尾➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 01 2 3 4手で)
21 2 9 8 5 6 7 03 4手で)
23 4 1 2 9 8 5 6 7 0
4対は隣接残ります。(3 4) (1 2) (5 6) (6 7)

テストケース:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

出力: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

出力: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

出力: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

出力: weak


26 13
26 13
26 13
26 13

出力: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

出力: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

出力: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

出力: fair

要件:

  • 関数を作成する場合、標準入力から読み取るか、単一の文字列パラメーターとして入力を受け取ることができます。また、関数は出力を出力するか、返すことができます。
  • プログラムは、自由に利用可能なソフトウェアを使用してLinuxで実行可能である必要があります。
  • ソースコードはASCII文字のみを使用する必要があります。
  • 標準的な抜け穴はありません。

2
なぜASCIIに制限があるのですか?多くの言語(APL、マシンコード、TI-BASIC)はASCIIをまったく使用しないため、これらを暗黙的に禁止しています。
リスト管理者

@ThomasKwa非ASCII文字の表示とカウントに関連する問題が気に入らないため。これらの言語の一部には、ASCII表現または代替があります。それほど厳しい制限ではなく、競技場をわずかに平準化できると思います。
SEがEVILであるためaditsuは終了します

「印刷可能なASCII文字のみを使用するエントリのバイト数にlog(95)/ log(256)を掛ける」などのスコアリングシステムは、印刷可能なASCII送信をかなり奨励する場合に適したオプションだと思います。その理由は、同じスコアのエントリの情報コンテンツは等しいということです。個人的には、まだバイト単位の単純なスコアリングを好むでしょう。
リトシアスト

@ThomasKwa OK、これはどうですか?のみ印刷可能なUnicode文字、カウントはUTF-8エンコーディングでバイト
aditsuが終了SEがEVILがあるので、

回答:




2

JavaScript、292 289バイト

これにより、おそらくより多くのバイトが圧縮される可能性がありますが、現時点では簡単な最初のパスです。

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

編集:i隣接するカードの数をカウントするときにデッキ構築ループからの値を再利用することにより3バイトを保存しました。

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