Алиса и Боб любят играть в карточную игру с колодой карт, пронумерованных последовательными неотрицательными целыми числами.
У Алисы есть особый способ перетасовать колоду. Сначала она берет верхнюю карту из колоды и кладет ее на дно колоды. Затем она удаляет следующую карту и начинает с нее колоду. Затем она снова переключает верхнюю карту на нижнюю и кладет новую верхнюю карту в колоду. Она повторяет этот процесс до тех пор, пока не опустошит колоду, и в этот момент колода является новой колодой.
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)
...