Алиса и Боб любят играть в карточную игру с колодой карт, пронумерованных последовательными неотрицательными целыми числами.
У Алисы есть особый способ перетасовать колоду. Сначала она берет верхнюю карту из колоды и кладет ее на дно колоды. Затем она удаляет следующую карту и начинает с нее колоду. Затем она снова переключает верхнюю карту на нижнюю и кладет новую верхнюю карту в колоду. Она повторяет этот процесс до тех пор, пока не опустошит колоду, и в этот момент колода является новой колодой.
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». Оборотные стороны карточек обращены влево.
Однажды Боб объявляет, что он берет отпуск на неделю. Алиса, не имея никого, кто мог бы сыграть в эту игру, завербовала свою подругу Еву. Теперь, Ева - бесстыдный мошенник, поэтому, когда она видит своеобразную перетасовку Алисы, она понимает, что может заранее сложить колоду в свою пользу!
Когда Ева возвращается домой после первого дня, она делает некоторый анализ игры и выясняет, что ее лучшие шансы, когда карты в порядке 0, 1, 2, 3, 4, 5, ... Она не сделала поймать, сколько карт было в колоде, поэтому она вынашивает заумную схему, чтобы написать на руке какой-то код, который при запуске принимает размер колоды и отображает порядок, в котором Ева должна положить карты, чтобы, когда Алиса тасует колоду, последняя колода имеет порядок 0, 1, 2, 3, ...
Ева на самом деле не имеет значения, на каком языке написан код (она знает их все), или является ли код функцией, принимающей целочисленный аргумент и возвращающей массив, или полной программой, принимающей ввод через аргумент командной строки или 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
источник
shuffle(shuffle(range(5))) == range(5)
...Ответы:
GolfScript,
151413 байтПопробуйте онлайн.
пример
Как это устроено
источник
{}/
вместо оператора карты, чтобы сохранить символ.](
поскольку первые два символа фактически помещают пустой массив под ввод, сохраняя вас позже[]\
.Юлия, 83
Последний элемент в возвращаемом векторе - это верх колоды.
источник
Mathematica,
927746 байтовОжидает ввод в переменную
n
:Это просто буквальное воспроизведение шаффла задом наперед, перемещая карту и кладя верхнюю карту сверху.
РЕДАКТИРОВАТЬ: не нужно отслеживать выходной стек, просто итерации по целым числам.
источник
Python 2.7 - 57
Красиво и просто, просто переверните шаффл. Довольно близко к тому, как это делает Golfscript.
источник
J (13 символов) и K (9)
Как выясняется, отменить перемешивание - это простой процесс, и у APL-лайков есть складное наречие,
/
которое поможет им сделать это как можно короче.J занимает 13 полукокса с
(_1|.,)/@i.@-
, а К нужно только 9:|(1!,)/!:
. APL будет так же кратко.Вот пошаговая трассировка версии J.
Вы можете заметить , что в J, мы поменяем массив целых чисел первого, но в K мы делаем это впоследствии: это потому , что K складка больше как
foldl
, по сравнению с J - хfoldr
.источник