Складіть колоду!


15

Аліса і Боб люблять грати в карткові ігри, з колодою карт, пронумерованими послідовними неотрицательними цілими числами.

Хоча Аліса має дуже особливий спосіб переміщення колоди. Спочатку вона бере верхню карту з колоди і кладе її в нижню частину колоди. Потім вона виймає наступну карту і починає купу з нею. Потім вона знову пересуває верхню карту до нижньої та кладе нову верхню карту на купу. Вона повторює цей процес до тих пір, поки вона не випорожнить колоду, і в цей момент купою стає нова колода.

  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

3
Прекрасне фразування, я отримаю тріщину.
ɐɔıʇǝɥʇuʎs

Це трохи заплутано, що ваші стеки вирівняні вгорі. І чітке визначення порядку стека також допоможе трохи прояснити питання.
Мартін Ендер

Те саме стосується колоди.
Мартін Ендер

Також: ви намагаєтесь обдурити нас, маючи зразок довжиною 5? Не бажаючи зіпсувати: shuffle(shuffle(range(5))) == range(5)...
ɐɔıʇǝɥʇuʎs

@Synthetica Я думаю, що так трапляється, що перемішування Аліси на колоді з 5 карт є інволюцією. Я не дуже думав про це під час публікації, оскільки це взагалі не відповідає.
алгоритм

Відповіді:


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
Ви можете використовувати {}/замість оператора карти для збереження карт.
Говард

Спасибі! Я хотів масив, тому я використав карту. Сила звички ...
Денніс

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

Математика, 92 77 46 байт

Очікує введення змінної n:

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

Це просто буквально грати в переміщення назад, переміщуючись по карті, а потім класти нижню карту зверху.

EDIT: Не потрібно слідкувати за вихідним стеком, просто повторіть цілі числа.


2

Python 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.@-, а До потрібно тільки 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 складка більше як foldl, по порівнянні з J - х foldr.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.