Układaj talię!

15

Alice i Bob lubią grać w karty, z talią kart ponumerowanych kolejnymi nieujemnymi liczbami całkowitymi.

Alice ma jednak szczególny sposób tasowania talii. Najpierw bierze górną kartę z talii i kładzie ją na spodzie talii. Następnie usuwa następną kartę i rozpoczyna z nią stos. Następnie ponownie umieszcza górną kartę na dole i kładzie nową górną kartę na stosie. Powtarza ten proces, dopóki nie opróżni talii. W tym momencie stos jest nową talią.

  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 | 

Ryc. 1: Alice wykonuje losowanie w talii 5 kart „3, 1, 4, 0, 2”. Wszystkie rewersy kart są skierowane w lewo.

Pewnego dnia Bob ogłasza, że ​​bierze tygodniowe wakacje. Alice, nie mając nikogo, z kim mogłaby grać, pozyskuje swoją przyjaciółkę Ewę. Teraz Ewa jest bezwstydnym oszustem, więc kiedy widzi dziwny los Alicji, zdaje sobie sprawę, że może wcześniej ułożyć talię na swoją korzyść!

Kiedy Eve wraca do domu po pierwszym dniu, analizuje grę i odkrywa, że ​​jej najlepsze szanse są, gdy karty są w kolejności 0, 1, 2, 3, 4, 5, ... Nie zrobiła tego złapać jednak, ile kart było w talii, więc opracowuje zającaty plan napisania kodu na ramieniu, który po uruchomieniu przyjmuje wielkość talii i wyświetla kolejność, w jakiej Ewa musi włożyć karty, aby kiedy Alice tasuje talię, ostatnia talia jest w kolejności 0, 1, 2, 3, ...

Dla Eve nie ma znaczenia, w jakim języku jest kod (zna je wszystkie) ani czy kod jest funkcją przyjmującą argument liczby całkowitej i zwracającą tablicę, czy też pełny program przyjmujący dane wejściowe za pomocą argumentu wiersza poleceń lub STDIN i zapisywanie wyników do STDOUT. Potrzebuje jednak możliwie najkrótszego kodu, aby zminimalizować szansę, że Alice go zobaczy i złapie.

Jakkolwiek niemoralne może być, czy możecie pomóc Ewie?

Przykładowe dane wejściowe i wyjściowe:

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
algorytmshark
źródło
3
Cudowne frazowanie, będę pękać.
Mayıʇǝɥʇuʎs
To trochę mylące, że twoje stosy są wyrównane u góry. A wyraźne określenie kolejności stosu pomogłoby nieco wyjaśnić pytanie.
Martin Ender
To samo dotyczy talii.
Martin Ender
Ponadto: czy próbujesz nas oszukać, próbka o długości 5? Bez shuffle(shuffle(range(5))) == range(5)
chęci
@Synthetica Chyba tak się dzieje, że tasowanie Alicji w talii 5 kart to inwolucja. Tak naprawdę nie myślałem o tym podczas publikowania, ponieważ ogólnie nie ma to miejsca.
algorytmshark

Odpowiedzi:

5

GolfScript, 15 14 13 bajtów

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

Wypróbuj online.

Przykład

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

Jak to działa

])    # 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.
Dennis
źródło
1
Możesz użyć {}/zamiast operatora mapy, aby zapisać znak.
Howard
Dzięki! Chciałem tablicy, więc użyłem mapy. Siła nawyku ...
Dennis
1
](ponieważ pierwsze dwa znaki skutecznie umieszczają pustą tablicę pod wejściem, oszczędzając później []\ .
Peter Taylor
Dzięki! Zbyt długo zajęło mi zrozumienie, dlaczego to nie działa z tłumaczem online. Zapomniałem wyczyścić stos ...
Dennis
5

Julia, 83

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

Ostatnim elementem w zwróconym wektorze jest góra pokładu.

gggg
źródło
4

Mathematica, 92 77 46 bajtów

Oczekuje danych wejściowych w zmiennej n:

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

To po prostu dosłownie odtwarzanie losowe do tyłu, przesuwanie karty, a następnie umieszczanie dolnej karty na górze.

EDYCJA: Nie musisz śledzić stosu wyjściowego, po prostu iteruj przez liczby całkowite.

Martin Ender
źródło
2

Python 2.7 - 57

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

Ładne i proste, wystarczy odwrócić losowanie. Dość blisko jak to robi Golfscript.

isaacg
źródło
1

J (13 znaków) i K (9)

Jak się okazuje, jest to prosty proces, aby cofnąć losowanie, a osoby lubiące APL mają przysłówek fold, /aby pomóc im w skróceniu tego tak krótko, jak to możliwe.

J trwa 13 char (_1|.,)/@i.@-, a tylko wymaga K 9: |(1!,)/!:. APL byłby podobnie zwięzły.

Oto krok po kroku ślad wersji 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

Można zauważyć, że w J, możemy odwrócić tablicę liczb całkowitych pierwszy, ale w K zrobimy to potem: to dlatego, że K-krotnie bardziej jak foldlw stosunku do J użytkownika foldr.

algorytmshark
źródło