Правила розповсюдження піратського світу


14

Існує існуюча «гра», де пірати раціонально ділять золоті монети за певними правилами. Цитування з Вікіпедії :

Є 5 раціональних піратів, A, B, C, D і E. Вони знаходять 100 золотих монет. Вони повинні вирішити, як їх розподілити.

Пірати мають суворий порядок вислугу років: А перевершує В, хто вищий за С, хто вище за Д, хто вищий за Е.

Таким чином, правила розповсюдження піратського світу: таким чином, щоб старший пірат пропонував розподілити монети. Пірати, в тому числі і пропонувач, потім голосують, чи приймати це розповсюдження. У разі невідповідного голосування пропонуючий подає голос. Якщо розподіл прийнято, монети виплачуються і гра закінчується. Якщо ні, то запропонований орган викидається за борт з піратського корабля і гине, а наступний самий старший пірат робить нову пропозицію запустити систему заново.

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

Виклик

Візьміть за вхід ціле число n, 1 <= n <= 99, де nкількість піратів, і виведіть розподіл монет, починаючи з першого пірата.

Тестові приклади (перший рядок вводиться; другий вихід):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Це , тому найкоротше рішення в байтах виграє.


1
Я думаю, що про це питали і раніше, але я не знав, де його знайти.
feersum


3
Арги [0]. Тепер у Java є причина використовувати це.
Аддісон Кримп

3
Навіщо обмежувати n < 100? Піратські кораблі, що перенавантажуються, також потребують розподільної допомоги.
Райан Кавано

1
@Neil, це жахлива ідея. Якщо це роблять "раціональні" пірати, то всі пірати, крім A, намагатимуться вбити A, щоб вони натомість отримали $ 100 / (n-1) $. Це швидко знищить усіх, крім двох останніх піратів.
kaine

Відповіді:


12

Желе , 11 10 байт

R%2ḊµSȷ2_;

Спробуйте в Інтернеті! або перевірити всі тестові справи одразу .

Як це працює

Для введення n завдання зводиться до створення списку x, 0, 1, 0, ... довжини n , сума якого 100 .

R%2ḊµSȷ2_;  Main link. Input: n

R           Yield [1, 2, ..., n].
 %2         Replace each integer by its parity. Yields [1, 0, 1, 0, ...].
   Ḋ        Dequeue; remove the first 1. This yields the list a = [0, 1, ...].
    µ       Begin a new, monadic link. Argument: a
     S      Compute the sum of a.
      ȷ2_   Subtract the sum from 100. (ȷ2 is 1e2 in Python syntax)
         ;  Prepend the difference to a.

7

Пітон, 33 байти

lambda n:([-n/2+101]+[0,1]*n)[:n]

Обчислює перше значення, додає деяке 0, 1, 0, 1..., скорочує довжинуn .

Зауважте, що -n/2+101його не можна скоротити, 101-n/2оскільки одинарні та двійкові -мають різний пріоритет: перший розбирається як, (-n)/2а другий як 101-(n/2).

Рекурсія була значно довшою (45):

f=lambda n,i=100:1/n*[i]or f(n-1,i-n%2)+[n%2]

4

MATL , 12 байт

:2\ts_101+l(

Для цього використовується поточна версія (9.2.2) мови / компілятора, яка є раніше, ніж ця проблема.

Приклад

>> matl :2\ts_101+l(
> 5
98  0  1  0  1

Пояснення

:         % implicitly input number "n". Generate vector [1, 2, ..., n]
2\        % modulo 2. Gives [1, 0, 1, ...]
ts        % duplicate and compute sum
_101+     % negate and add 101
l(        % assign that to first entry of [1, 0, 1, ...] vector. Implicitly display


3

Пітон, 62 58 байт

EDIT: Радий, що я зробив це однолінійним. Але я програю на Python. Тому це лише для довідки. Дякую @Zgarb

def x(i):n=[~j%2for j in range(i)];n[0]=101-sum(n);print n

Він займає вхід, створює список pf, парність всіх чисел від 1 до i. Потім встановлює перший елемент в i на 101-суму (n) і друкує.

Спробуйте тут


3

Javascript ES6, 45 байт

a=>[...Array(a)].map((x,y)=>y?--y%2:202-a>>1)

Завдяки @Neil за 1 байт збережено!


1
202-a>>1зберігає байт.
Ніл

3

𝔼𝕊𝕄𝕚𝕟, 14 символів / 26 байт

⩥ï⒨?‡$%2:ỉ-ï»1

Try it here (Firefox only).

Непогано, але й непогано ...

Пояснення

⩥ï⒨?‡$%2:ỉ-ï»1 // implicit: ï=input, ṥ=101
⩥ï⒨            // map over a range [0,ï) and return:
    ?‡$%2       // (if mapitem>0) then ($-1) mod 2
         :ỉ-ï»1 // (else) 202-ï>>1
                // implicit output

2

Серйозно, 23 17 байт

EDIT : Дякую @quintopia

,R`2@%`M;Σ2╤u-0(T

Використовується той же підхід, що і моя відповідь Python, але я виконую модуль 2 за допомогою картографування, і кілька разів обертаю стек.

Пояснення :

Цей код підштовхує введення (я його назву i). Далі штовхає range(1,i+1)і робить функцію. Потім натискає 2, обертає стек і, нарешті, бере модуль.

Далі, перенесіть цю функцію на діапазон, який можна переглядати. Це дає паритет кожного елемента в списку.

Нарешті, дублює стек, підсумовує список парності, натискає 2, 10 ^ 2 та 100 + 1 і віднімає суму (дозволь мені назвати це значення n). Далі код натискає 0, повертає стек на 1 і встановлює елемент індексу 0 списку на n. Отриманий список друкується неявно.


Це має бути не більше 17 байт:,R`2@%`M;Σ2╤u-0(T
квінтопія,

1

Japt, 14 байт

Ще одне завдання, де я вважаю, що бажаю вбудованого, я щойно розглядав, як додати ...

1oU mv u#Ê-UÁ1

Спробуйте в Інтернеті!

1oU mv u#Ê-UÁ1  // Implicit: U = input integer
1oU             // Create the range [1, U).
    mv          // Map each item to 1 if even, 0 otherwise.
       u        // Unshift (add to the beginning of the array)
        #Ê-UÁ1  //  the char code of Ê (202), minus U >>> 1 (floor of U / 2).

1

Сценарій дій 3, 87 байт

function x(n){var l=[],i=1;for (l[0]=int(101-n/2);i<n;){l[i]=++i%2;}return l.join(" ")}

Це не найкраща мова з гольфу, але мені подобається публікувати as3 відповіді.



0

Perl 51 49 44 байт

$,=$";@"=map{$i++%2}2..<>;say 100-(@">>1),@"

Потрібні наступні варіанти perlrun -E

$ perl -E'$,=$";@"=map{$i++%2}2..<>;say 100-(@">>1),@"'<<<5
98
0
1
0
1

0

QBIC , 28 25 байт

:?100-(a-1)'\`2[2,a|?b%2

Пояснення

:               Get command line parameter, assign to 'a'
                Determine the part of the treasure for the crew:
      (a-1) \ 2 Integer Divide 'a'-1 by 2. The -1 compensates for even cases.
           ' `  Make \ a direct command for QBasic instead of substituting it for ELSE.
?100-           Print 100 coins, minus the crew-share --> Captain's booty.
[2,a|           FOR b=2; b <= a; b++; ie for every other crew member
?b%2            Give every odd crewman a coin.
                [FOR loop implicitly closed by QBIC]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.