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
źródło
shuffle(shuffle(range(5))) == range(5)
Odpowiedzi:
GolfScript,
151413 bajtówWypróbuj online.
Przykład
Jak to działa
źródło
{}/
zamiast operatora mapy, aby zapisać znak.](
ponieważ pierwsze dwa znaki skutecznie umieszczają pustą tablicę pod wejściem, oszczędzając później[]\
.Julia, 83
Ostatnim elementem w zwróconym wektorze jest góra pokładu.
źródło
Mathematica,
927746 bajtówOczekuje danych wejściowych w zmiennej
n
: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.
źródło
Python 2.7 - 57
Ładne i proste, wystarczy odwrócić losowanie. Dość blisko jak to robi Golfscript.
źródło
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.
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
foldl
w stosunku do J użytkownikafoldr
.źródło