デッキのシャッフルをやめて、もうプレイしてください。


31

チャレンジ:

入力:範囲内の明確な正整数の。[1,list-size]

出力:整数:リストがリッフルシャッフルされる回数。リストの場合、これはリストが2つの半分に分割され、これらの半分がインターリーブされることを意味します(つまり、リストを[1,2,3,4,5,6,7,8,9,10]1回リッフルシャッフルすると結果が[1,6,2,7,3,8,4,9,5,10]になるため、このチャレンジでは入力[1,6,2,7,3,8,4,9,5,10]がになります1)。

チャレンジルール:

  • リストには、の範囲の正の整数のみが含まれると仮定でき(または 0インデックス付きの入力リストを選択した場合は)。[1,list-size][0,list-size1]
  • すべての入力リストは、有効なリフルシャッフルリスト、またはシャッフルされていないソート済みリスト(この場合、出力は0)のいずれかであると想定できます。
  • input-listには少なくとも3つの値が含まれると想定できます。

段階的な例:

入力: [1,3,5,7,9,2,4,6,8]

一度アンシャフリングすると[1,5,9,4,8,3,7,2,6]、次のよう[1, ,5, ,9, ,4, ,8]になります。偶数の0インデックスが付けられたすべてのアイテムが最初に来て、その後、奇数の0インデックスが付けられたすべてのアイテムがその後に来るためです[ ,3, ,7, ,2, ,6, ]
リストはまだ順序付けられていないため、続行します。

もう一度リストをUnshufflingは次のようになります[1,9,8,7,6,5,4,3,2]
:再びになる[1,8,6,4,2,9,7,5,3]
その後:[1,6,2,7,3,8,4,9,5]
:そして最後に[1,2,3,4,5,6,7,8,9]、我々はunshuffling行われているので、順序付けられたリストです。

を取得するために元のファイルを[1,3,5,7,9,2,4,6,8]5回シャッフル解除した[1,2,3,4,5,6,7,8,9]ため、出力は5この場合になります。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)へのリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

Input                                                   Output

[1,2,3]                                                 0
[1,2,3,4,5]                                             0
[1,3,2]                                                 1
[1,6,2,7,3,8,4,9,5,10]                                  1
[1,3,5,7,2,4,6]                                         2
[1,8,6,4,2,9,7,5,3,10]                                  2
[1,9,8,7,6,5,4,3,2,10]                                  3
[1,5,9,4,8,3,7,2,6,10]                                  4
[1,3,5,7,9,2,4,6,8]                                     5
[1,6,11,5,10,4,9,3,8,2,7]                               6
[1,10,19,9,18,8,17,7,16,6,15,5,14,4,13,3,12,2,11,20]    10
[1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20]    17
[1,141,32,172,63,203,94,234,125,16,156,47,187,78,218,109,249,140,31,171,62,202,93,233,124,15,155,46,186,77,217,108,248,139,30,170,61,201,92,232,123,14,154,45,185,76,216,107,247,138,29,169,60,200,91,231,122,13,153,44,184,75,215,106,246,137,28,168,59,199,90,230,121,12,152,43,183,74,214,105,245,136,27,167,58,198,89,229,120,11,151,42,182,73,213,104,244,135,26,166,57,197,88,228,119,10,150,41,181,72,212,103,243,134,25,165,56,196,87,227,118,9,149,40,180,71,211,102,242,133,24,164,55,195,86,226,117,8,148,39,179,70,210,101,241,132,23,163,54,194,85,225,116,7,147,38,178,69,209,100,240,131,22,162,53,193,84,224,115,6,146,37,177,68,208,99,239,130,21,161,52,192,83,223,114,5,145,36,176,67,207,98,238,129,20,160,51,191,82,222,113,4,144,35,175,66,206,97,237,128,19,159,50,190,81,221,112,3,143,34,174,65,205,96,236,127,18,158,49,189,80,220,111,2,142,33,173,64,204,95,235,126,17,157,48,188,79,219,110,250]
                                                        45

長さが奇数で出力が0より大きい1つまたは2つのテストケースが適切です。組み込みに頼るのではなく、自分でリフルコードを記述する必要がある場合、そのような場合にはリフルを台無しにするのは簡単です。
オリビエグレゴワール

@OlivierGrégoireの[1,3,5,7,9,2,4,6,8]長さは9ですが、おそらく長さ7と11にいくつか追加します。編集:テストケース[1,3,5,7,2,4,6] = 2(長さ7)と[1,6,11,5,10,4,9,3,8,2,7] = 6(長さ11)を追加しました。お役に立てば幸いです。
ケビンクルーッセン

私の悪い点:あなたが言及したテストケースはサイズ8であると確信していました。しかし、余分なテストケースに感謝します。
オリビエグレゴワール

1
現在定式化されている質問は「間違っている」ようです...何らかのリッフルシャッフルは、何らかのトリックを引っ張っているのでなければ、最初と最後のカードが変わるはずです!つまり、10枚のカードを1回シャッフルした後の[6,1,7,2,8,3,9,4,10,5]。
スティーブ

2
@スティーブあなたはちょっと正しいと思います。リフルシャッフリング一般的には、単純に二つの部分をインターリーブ、両[1,6,2,7,3,8,4,9,5,10]又は[6,1,7,2,8,3,9,4,10,5]可能です。私の挑戦では、それは確かに詐欺トリックのビットですので、一番上のカードは常に、一番上のカード残ること..私は誰かのIRLの使用を平均見たことがないんだけがカードのデッキをシャッフルするリフル・シャッフル。通常、それらは他の種類のシャッフルも間に使用します。とにかく、今すぐチャレンジを変更するには遅すぎるので、このチャレンジのために、トップカードはリフルシャッフル後も常にトップカードのままです。
ケビンクルーッセン

回答:



25

JavaScript(ES6)、44バイト

@nwellnhofによって提案された短いバージョン

入力として1インデックスのカードを含むデッキが必要です。

f=(a,x=1)=>a[x]-2&&1+f(a,x*2%(a.length-1|1))

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

長さデッキが与えられた場合、以下を定義します。[c0,,cL1]L

xn={2nmodLif L is odd2nmod(L1)if L is even

そして、となるを探します。ncxn=2


JavaScript(ES6)、 57 52  50バイト

インデックスが0のカードが入力としてあるデッキが必要です。

f=(a,x=1,k=a.length-1|1)=>a[1]-x%k&&1+f(a,x*-~k/2)

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

どうやって?

JSにはカスタムステッピングで配列スライスを抽出するためのネイティブサポートがないため、riffle-shuffle全体のシミュレーションはおそらくかなりコストがかかります(しかし、正直なところ、私は試してさえいませんでした)。ただし、2枚目のカードとデッキ内のカードの合計数を調べるだけでも解決方法を見つけることができます。

長さデッキを考えると、このコードはような探します。Ln

c2(k+12)n(modk)

ここ第2のカードであり、次のように定義されます。c2k

k={Lif L is oddL1if L is even


12

Python 2、39バイト

f=lambda x:x[1]-2and-~f(x[::2]+x[1::2])

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

-4 ジョナサンアランに感謝します。


で4バイトを節約f=lambda x:2!=x[1]and-~f(x[::2]+x[1::2])
ジョナサンアラン

@JonathanAllanああ、もちろん!まあ... !=することができます-。;-)
エリック・ザ・アウトゴルファー

ああ、ええ、警告の空欄:D(またはちょうどx[1]>2私が推測する)
ジョナサンアラン

5

R58 55 45バイト

a=scan();while(a[2]>2)a=matrix(a,,2,F<-F+1);F

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

並べ替えプロセスをシミュレートします。入力は1から始まり、FALSE0を返します。


非常に素晴らしい!私は同様のアプローチに取り組んでいましたが、再帰的な関数を使用していましたが、ゴルフとしてはうまくいきませんでした。
user2390246


5

APL(Dyalog Unicode)35 26 23 22 バイトSBCS

{⍵≡⍳≢⍵:01+∇⍵[⍒2|⍳⍴⍵]}

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

助けてくれたAdámに感謝します。Erikthe Outgolferは-3、ngnは-1です。

TIOリンクには2つのテストケースが含まれています。

説明:

{⍵≡⍳≢⍵:01+∇⍵[⍒2|⍳⍴⍵]}
{⍵≡⍳≢⍵:01+∇⍵[⍒2|⍳⍴⍵]}  function takes one argument: ⍵, the array
 ⍵≡⍳≢⍵                  if the array is sorted:
 ⍵≡⍳≢⍵                  array = 1..length(array)
      :0                then return 0
                       otherwise
         1+             increment
                       the value of the recursive call with this argument:
            ⍵[      ]   index into the argument with these indexes:
                 ⍳⍴⍵    - generate a range from 1 up to the size of 
               2|       - %2: generate a binary mask like [1 0 1 0 1 0]
                       - grade (sorts but returns indexes instead of values), so we have the indexes of all the 1s first, then the 0s.

¹



@EriktheOutgolferどうもありがとう、ありがとう!
ヴェン

1
∧/2≤/⍵->⍵≡⍳≢⍵
ngn

@ngnは、配列に穴がないことに気付きませんでした。ありがとう!
ヴェン

4

Perl 6の36の34 32バイト

nwellnhofのおかげで-2バイト

$!={.[1]-2&&$!(.sort:{$++%2})+1}

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

リストが並べ替えられるまで、2を法とするインデックスで並べ替えることにより、逆さざ波シャッフルが行われ、シーケンスの長さが返されます。

面白いです、私は通常Perl 6の再帰的なアプローチを試みませんが、今回は元のものより短くなりました。

説明:

$!={.[1]-2&&$!(.sort:{$++%2})+1}
$!={                           }   # Assign the anonymous code block to $!
    .[1]-2&&                       # While the list is not sorted
            $!(             )      # Recursively call the function on
               .sort:{$++%2}       # It sorted by the parity of each index
                             +1    # And return the number of shuffles

3

05AB1E(レガシー)、9バイト

[DāQ#ι˜]N

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

説明

[   #  ]     # loop until
  ā          # the 1-indexed enumeration of the current list
 D Q         # equals a copy of the current list
     ι˜      # while false, uninterleave the current list and flatten
        N    # push the iteration index N as output

レガシーでは、ループの外側でインデックスを出力できることさえ知りませんでした。新しい05AB1Eバージョンのように、その時点で再び0になると思いました。いい答えだ!この課題に影響を与えたシャッフル解除ビルトインを使用する10バイトよりも短いÅ≠。:)
ケビンクルーイッセン

@KevinCruijssen:興味深い。シャッフルが行われたことは知りませんでした。この例では私のバージョンと同じですが、アンシャッフルは2D配列の寸法を維持します。
エミグナ

3

Java(JDK)、59バイト

a->{int c=0;for(;a[(1<<c)%(a.length-1|1)]>2;)c++;return c;}

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

サイズが31未満の配列または反復が31未満のソリューションでのみ確実に動作します。より一般的なソリューションについては、63バイトの次のソリューションを参照してください。

a->{int i=1,c=0;for(;a[i]>2;c++)i=i*2%(a.length-1|1);return c;}

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

説明

波紋では、次の位置は前の1倍の2モジュロで、奇数の場合は長さ、偶数の場合は長さ1です。

そのため、配列で値2が見つかるまで、この式を使用してすべてのインデックスを繰り返し処理しています。

クレジット


x.clone()代わりに2回使用して163バイトA.copyOf(x,l)
ケビンクルーイッセン


@Arnauldありがとう!私はその「奇数の場合の長さ-1」を単純化する方法を考えるのに苦労しました
オリビエ・グレゴワール

@アーナウルドああ!...私の新しいアルゴリズムは、実際にはあなたと同じです...そして私は自分でそれを考え出す時間半を費やした
オリヴィエ・グレゴワール

より正確には、@ nwellnhofが見つけた元のアルゴリズムよりも改善されています。
アーナード

3

J28 26バイト

-Jonahのおかげで2バイト!

 1#@}.(\:2|#\)^:(2<1{])^:a:

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

VenのAPLソリューションに触発されました。

説明:

               ^:       ^:a:   while 
                 (2<1{])       the 1-st (zero-indexed) element is greater than 2   
     (        )                do the following and keep the intermediate results
          i.@#                 make a list form 0 to len-1
        2|                     find modulo 2 of each element
      /:                       sort the argument according the list of 0's and 1's
1  }.                          drop the first row of the result
 #@                            and take the length (how many rows -> steps)     

K(ngn / k)、25バイト

ngnのアドバイスとK通訳に感謝します!

{#1_{~2=x@1}{x@<2!!#x}\x}

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


収束してから 1つをドロップしてカウントします。これによりコードが短くなります
ngn

@ngn。だから、私のJソリューションと同様に-後でやってみます、ありがとう!
ガレンイワノフ

1
1#@}.(\:2|#\)^:(2<1{])^:a:26バイト
ジョナ

@ジョナありがとうございます!
ガレンイワノフ

2

APL(NARS)、文字49、バイト98

{0{∧/¯1↓⍵≤1⌽⍵:⍺⋄(⍺+1)∇⍵[d],⍵[i∼d←↑¨i⊂⍨2∣i←⍳≢⍵]}⍵}

1つの線形nを使用できる場合に、nlog(n)である必要がある1つのアルゴリズムである最深ループで使用する理由 あと数バイトだけですか?[⍵≡⍵[⍋⍵] O(nlog n)およびseeの各要素に対theするには、∧/¯1↓⍵≤1⌽⍵O(n)] testを使用します。

  f←{0{∧/¯1↓⍵≤1⌽⍵:⍺⋄(⍺+1)∇⍵[d],⍵[i∼d←↑¨i⊂⍨2∣i←⍳≢⍵]}⍵}
  f ,1
0
  f 1 2 3
0
  f 1,9,8,7,6,5,4,3,2,10
3
  f 1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20
17

誰かが文字とバイトを区別するのを見たのは初めてです👍。Unicode文字を見ると常にバグが発生し、文字ごとに1バイトだと主張します。このは1バイトではありません!
Kerndog73

@ Kerndog73すべては数字ですが、APLでは文字は数字ではないと思います...(AV配列の要素のようです)
RosLuP

2

ルビー、42バイト

f=->d,r=1{d[r]<3?0:1+f[d,r*2%(1|~-d.max)]}

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

どうやって:

配列内の番号2を検索します。2番目の位置にある場合、デッキはシャッフルされていません。そうでない場合は、連続したシャッフルによって配置される位置を確認します。



2

C(GCC)64 63バイト

nwellnhofから-1バイト

i,r;f(c,v)int*v;{for(i=r=1;v[i]>2;++r)i=i*2%(c-1|1);return~-r;}

これは、アーナルドとオリビエグレゴワールの回答に基づいた劇的に短い回答です。隣接していないカードを持つデッキの少し一般的な問題を解決するため、古いソリューションを以下に残します。

オンラインで試す


C(GCC)162バイト

a[999],b[999],i,r,o;f(c,v)int*v;{for(r=0;o=1;++r){for(i=c;i--;(i&1?b:a)[i/2]=v[i])o=(v[i]>v[i-1]|!i)&o;if(o)return r;for(i+=o=c+1;i--;)v[i]=i<o/2?a[i]:b[i-o/2];}}

オンラインで試す

a[999],b[999],i,r,o; //pre-declare variables
f(c,v)int*v;{ //argument list
    for(r=0;o=1;++r){ //major loop, reset o (ordered) to true at beginning, increment number of shuffles at end
        for(i=c;i--;(i&1?b:a)[i/2]=v[i]) //loop through v, split into halves a/b as we go
            o=(v[i]>v[i-1]|!i)&o; //if out of order set o (ordered) to false
        if(o) //if ordered
            return r; //return number of shuffles
        //note that i==-1 at this point
        for(i+=o=c+1;i--;)//set i=c and o=c+1, loop through v
            v[i]=i<o/2?a[i]:b[i-o/2];//set first half of v to a, second half to b
    }
}

2

R、85バイト

s=scan();u=sort(s);k=0;while(any(u[seq(s)]!=s)){k=k+1;u=as.vector(t(matrix(u,,2)))};k

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

説明

愚かな(強引な)方法で、カード#2を追うよりもずっとエレガントではありません。

入力suシャッフル解除する代わりに、ソートされたベクトルで開始しsます。これは、と同じになるまで徐々にシャッフルします。これにより、奇数長のベクトルが2列の行列に折り畳まれるため、奇数長の入力に対して警告が表示されます(ただし、シャッフルカウントは依然として正しい)。その場合、Rでは、入力の最初の要素をリサイクルすることにより、欠落したデータポイントが埋められます。

シャッフル解除できないベクトルを提供した場合、ループは終了しません。

補遺:代わりにシャッフル解除する場合、1バイトを節約します。上記の答えとは異なり、で転置する必要はありませんがt()、順序付けはbyrow=TRUET表示される理由matrix()です。

R、84バイト

s=scan();u=sort(s);k=0;while(any(s[seq(u)]!=u)){k=k+1;s=as.vector(matrix(s,,2,T))};k

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


タイトルを修正し、テストケースのTIOリンクを追加する(他のR回答に基づいて)自由を取り、回答が意図したとおりに動作することを確認したので、+ 1してPPCGにようこそ!:)
ケビン・クルーッセン





1

Pyth、18バイト

L?SIb0hys%L2>Bb1
y

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

-2 @Erik the Outgolferに感謝します。

スクリプトには2行があります。最初の行は関数を定義しy、2行目yは暗黙のQ(評価されたstdin)引数で呼び出します。

L?SIb0hys%L2>Bb1
L                function y(b)
 ?               if...
  SIb            the Invariant b == sort(b) holds
     0           return 0
      h          otherwise increment...
       y         ...the return of a recursive call with:
             B   the current argument "bifurcated", an array of:
              b   - the original argument
            >  1  - same with the head popped off
          L      map...
         % 2     ...take only every 2nd value in each array
        s         and concat them back together

¹



1

Japt13 11 10バイト

私の光沢のある、新しい取ると非常に -work-進行中のテストドライブのために通訳を。

ÅÎÍ©ÒßUñÏu

試してみるかすべてのテストケースを実行してください

ÅÎÍ©ÒßUñÏu     :Implicit input of integer array U
Å              :Slice the first element off U
 Î             :Get the first element
  Í            :Subtract from 2
   ©           :Logical AND with
    Ò          :  Negation of bitwise NOT of
     ß         :  A recursive call to the programme with input
      Uñ       :    U sorted
        Ï      :    By 0-based indices
         u     :    Modulo 2

1
このインタプリタはとてもクールに見えます。
再帰的な

0

Python 3、40バイト

f=lambda x:x[1]-2and 1+f(x[::2]+x[1::2])  # 1-based
f=lambda x:x[1]-1and 1+f(x[::2]+x[1::2])  # 0-based

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

私はもっ​​と頻繁にページを更新する必要があります:Erik the Outgolferの同様のトリックを行っている編集を逃した=)

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