갑판을 쌓아 라!


15

Alice와 Bob은 음수가 아닌 정수로 번호가 매겨진 카드 덱으로 카드 게임을 좋아합니다.

그러나 Alice는 데크를 섞는 매우 특별한 방법이 있습니다. 먼저, 그녀는 덱에서 맨 위 카드를 가져 와서 덱 맨 아래에 놓습니다. 그런 다음 그녀는 다음 카드를 꺼내고 더미를 시작합니다. 그런 다음 다시 맨 위 카드를 맨 아래로 순환시키고 새 맨 위 카드를 더미에 놓습니다. 그녀는 갑판을 비울 때까지이 과정을 반복합니다.이 시점에서 더미는 새로운 갑판입니다.

  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 : Alice는 5 카드 데크 "3, 1, 4, 0, 2"에서 셔플을 수행합니다. 카드 뒷면이 모두 왼쪽을 향하고 있습니다.

어느 날 밥은 일주일의 휴가를 보내고 있다고 발표했다. 게임을 할 사람이없는 앨리스는 친구 이브를 불러 들인다. 이제 이브는 부끄러운 사기꾼이므로 앨리스의 독특한 셔플을 보면 미리 데크를 쌓을 수 있다는 것을 알게됩니다!

Eve는 첫날 이후 집에 돌아 왔을 때 게임에 대한 분석을하고 카드가 0, 1, 2, 3, 4, 5 순서 일 때 가장 가능성이 높다는 것을 알아 냈습니다. 덱에 몇 장의 카드가 있었는지 알기 때문에, 그녀는 팔에 코드를 작성하기 위해 겁에 질린 방식을 부화 시키며, 뛸 때 덱의 크기를 취하고 Eve가 카드를 넣는 순서를 표시합니다. 앨리스가 덱을 섞고 마지막 덱은 0, 1, 2, 3, ...

코드가 어떤 언어인지 (그녀가 모두 알고 있음), 또는 정수 인수를 취하고 배열을 반환하는 함수인지 명령 행 인수 또는 STDIN을 통해 입력을받는 전체 프로그램인지 여부는 Eve에게 중요하지 않습니다. 그리고 STDOUT에 결과를 쓰는 것. 그러나 그녀는 Alice가 코드를보고 붙잡을 가능성을 최소화하기 위해 가능한 짧은 코드를 필요로합니다.

부도덕 한 것처럼, 너희들은 이브를 도울 수 있습니까?

입력 및 출력 예 :

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

스택이 맨 위에 정렬되는 것은 약간 혼란 스럽습니다. 스택의 순서를 명시 적으로 지정하면 질문을 약간 명확하게하는 데 도움이됩니다.
Martin Ender

갑판도 마찬가지입니다.
마틴 엔더

또한 : 길이 5의 샘플을 사용하여 우리를 속이려고합니까? 망치고 바라지 않고 : shuffle(shuffle(range(5))) == range(5)...
ɐɔıʇǝɥʇuʎs

@ Synthetica 5 카드 데크에서 Alice의 셔플이 진화 한 것 같습니다. 나는 그것이 일반적으로 유지되지 않기 때문에 게시 할 때 그것에 대해 실제로 생각하지 않았습니다.
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
{}/지도 연산자 대신 문자를 저장하는 데 사용할 수 있습니다 .
Howard

감사! 배열을 원했기 때문에 map을 사용했습니다. 습관의 힘 ...
데니스

1
](처음 두 문자는 입력 아래에 빈 배열을 효과적으로 배치하므로 나중에 절약 할 수 있습니다 []\ .
피터 테일러

감사! 이것이 온라인 통역사와 작동하지 않는 이유를 알아내는 데 너무 오래 걸렸습니다. 스택을 지우는 것을 잊었다 ...
데니스

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

파이썬 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와 비교하여 더 닮기 때문 foldr입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.