デッキを積み重ねてください!


15

アリスとボブは、連続する非負の整数で番号が付けられたカードのデッキで、カードゲームをするのが好きです。

しかし、アリスにはデッキをシャッフルする非常に特別な方法があります。まず、彼女はデッキから一番上のカードを取り、デッキの一番下に置きます。それから彼女は次のカードを取り除き、それで山を始めます。その後、彼女は再び一番上のカードを一番下に循環させ、新しい一番上のカードを山に置きます。彼女はデッキを空にするまでこのプロセスを繰り返し、その時点でパイルが新しいデッキになります。

  deck     |  pile
-----------+-----------
 3 1 4 0 2 | 
 1 4 0 2 3 | 
 4 0 2 3   |         1
 0 2 3 4   |         1
 2 3 4     |       0 1
 3 4 2     |       0 1
 4 2       |     3 0 1
 2 4       |     3 0 1
 4         |   2 3 0 1
           | 4 2 3 0 1
 4 2 3 0 1 | 

図1:アリスは5カードデッキ「3、1、4、0、2」でシャッフルを実行します。カードの裏面はすべて左を向いています。

ある日、ボブは、1週間の休暇を取ることを発表します。アリスは、ゲームをプレイする人がいないため、友人のイブに参加します。今、イブは恥知らずな詐欺師であるため、アリスの独特のシャッフルを見ると、彼女は事前にデッキを有利に積み重ねることができることに気付きます!

イブが最初の日を終えて家に帰ると、彼女はゲームについていくつかの分析を行い、カードが0、1、2、3、4、5の順序にある​​ときが一番のオッズであることを理解します。しかし、デッキに何枚のカードがあったかを把握し、彼女は腕にいくつかのコードを書くために頭を悩ますスキームをhatch化させます。アリスはデッキをシャッフルします。最後のデッキは0、1、2、3、...の順序です。

Eveはコードがどの言語であるか(彼女はそれらをすべて知っています)、コードが整数引数を取り配列を返す関数か、コマンドライン引数またはSTDINを介して入力を受け取る完全なプログラムであるかは、実際には関係ありません結果をSTDOUTに書き込みます。しかし、アリスがそれを見てキャッチする可能性を最小限に抑えるために、彼女はできるだけ短いコードを必要とします。

不道徳かもしれませんが、皆さんはイブを助けることができますか?

入力と出力の例:

in  out
 1  0
 2  0 1
 5  2 4 0 3 1
10  2 9 4 8 0 7 3 6 1 5
52  6 51 25 50 12 49 24 48 1 47 23 46 11 45 22 44 5 43 21 42 10 41 20 40 2 39 19
    38 9 37 18 36 4 35 17 34 8 33 16 32 0 31 15 30 7 29 14 28 3 27 13 26

3
素敵なフレージング、割れます。
ɐɔıʇǝɥʇuʎs

スタックが一番上に並んでいるのは少しわかりにくいです。また、スタックの順序を明示的に指定すると、質問を少し明確にするのにも役立ちます。
マーティンエンダー

デッキについても同じことが言えます。
マーティンエンダー

また、長さ5のサンプルを使用して私たちをだまそうとしていますか?台無しに望むものではない:shuffle(shuffle(range(5))) == range(5)...
ɐɔıʇǝɥʇuʎs

@Synthetica 5カードデッキでのアリスのシャッフルはインボリューションだと思います。一般的には成り立たないので、投稿するときはあまり考えませんでした。
algorithmshark

回答:


5

GolfScript、15 14 13バイト

])~,{\+)\+}/`

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

$ golfscript alice.gs <<< 10
[2 9 4 8 0 7 3 6 1 5]

使い方

])    # Collect the stack into an array and pop. This leaves [] below the input string.
~     # Interpret the input string.
,     # For input “N”, push the array [ 0 … N-1 ] (the pile).
{     # For each card on the pile:
  \+  # Put the card on top of the deck.
  )   # Remove a card from the bottom of the deck.
  \+  # Put the card on top of the deck.
}/    #
`     # Convert the deck into a string.

1
{}/文字を保存するために、マップ演算子の代わりに使用できます。
ハワード

ありがとう!配列が欲しかったので、mapを使用しました。習慣の力...
デニス・

1
](最初の2文字は入力の下に空の配列を効果的に配置し、後で保存するため[]\ です。
ピーターテイラー

ありがとう!これがオンライン通訳で機能しなかった理由を理解するのに時間がかかりすぎました。...スタックをクリアするために忘れてしまった
デニス

5

ジュリア、83

u(n)=(a=[n-1:-1:0];l=Int[];[push!(l,shift!(push!(l,pop!(a)))) for i=1:length(a)];l)

返されるベクトルの最後の要素は、デッキの上部です。


4

Mathematica、92 77 46バイト

変数の入力を期待しますn

l={};(l=RotateRight[{#-1}~Join~l])&/@Range@n;l

カードの上を移動し、一番下のカードを上に置くことで、文字通りシャッフルを逆方向​​に再生します。

編集:出力スタックを追跡する必要はなく、整数を反復処理するだけです。


2

Python 2.7-57

d=[0]
for j in range(1,input()):d=[d.pop()]+[j]+d
print d

素敵でシンプル、シャッフルを逆にするだけです。Golfscriptの方法にかなり近い。


1

J(13文字)およびK(9)

結局のところ、それはシャッフルを元に戻す簡単なプロセスであり、APLのようなものは、/これを可能な限り短くするのに役立つ折り畳み副詞を持っています。

Jはで13文字を使用しますが(_1|.,)/@i.@-、Kは9:のみを必要とします|(1!,)/!:。APLも同様に簡潔です。

Jバージョンの段階的なトレースを次に示します。

(_1|.,)/@i.@- 4                  NB. recall that J is right-associative
(_1|.,)/@i. - 4                  NB. u@v y  is  u v y
(_1|.,)/@i. _4                   NB. monad - is Negate
(_1|.,)/ i. _4                   NB. @
(_1|.,)/ 3 2 1 0                 NB. monad i. is Integers, negative arg reverses result
3 (_1|.,) 2 (_1|.,) 1 (_1|.,) 0  NB. u/ A,B,C  is  A u B u C
3 (_1|.,) 2 (_1|.,) _1 |. 1 , 0  NB. x (M f g) y  is  M f x g y
3 (_1|.,) 2 (_1|.,) _1 |. 1 0    NB. dyad , is Append
3 (_1|.,) 2 (_1|.,) 0 1          NB. dyad |. is Rotate
3 (_1|.,) _1 |. 2 , 0 1          NB. repeat ad nauseam
3 (_1|.,) _1 |. 2 0 1
3 (_1|.,) 1 2 0
_1 |. 3 , 1 2 0
_1 |. 3 1 2 0
0 3 1 2

Jで最初に整数の配列を逆にすることに気付くかもしれませんが、Kでは後でそれを行います。これは、Kの折り畳みがfoldlJに比べてa に似ているためfoldrです。

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