Правила распространения в пиратском мире

14

Существует существующая «игра», в которой пираты рационально делят золотые монеты по определенным правилам. Цитата из Википедии :

Есть 5 рациональных пиратов, A, B, C, D и E. Они находят 100 золотых монет. Они должны решить, как их распределить.

У пиратов строгий порядок старшинства: A превосходит B, кто выше C, кто выше D, кто выше E.

Правила распространения в пиратском мире таковы: самый старший пират должен предложить распределение монет. Пираты, включая автора, затем голосуют за то, чтобы принять это распределение. В случае равного голосования голосующий имеет решающий голос. Если распределение принято, монеты раздаются и игра заканчивается. Если нет, тот, кто предлагает, сбрасывается с пиратского корабля за борт и умирает, а следующий самый старший пират делает новое предложение, чтобы снова запустить систему.

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

Вызов

Возьмите в качестве входных данных целое число n1 <= n <= 99, где nуказано количество пиратов, и выведите распределение монет, начиная с первого пирата.

Тестовые случаи (первая строка - это ввод; вторая - вывод):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Это , поэтому выигрывает самое короткое решение в байтах.

andlrc
источник
1
Я думаю, что об этом спрашивали раньше, но я не знаю, где его найти.
feersum
2
@feersum codegolf.stackexchange.com/questions/54235/… (удалено)
Деннис
3
Args [0]. У Java теперь есть причина использовать это.
Эддисон Крамп
3
Зачем ограничивать n < 100? Слишком укомплектованные, позолоченные пиратские корабли также нуждаются в распределительной помощи.
Райан Кавано
1
@ Нейл, это ужасная идея. Если это то, что делают «рациональные» пираты, то все пираты, кроме А, попытаются убить А, чтобы вместо этого они получили $ 100 / (n-1) $. Это быстро убьет всех, кроме двух последних пиратов.
Кейн

Ответы:

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

Python, 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]
XNOR
источник
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

Python, 62 58 байт

РЕДАКТИРОВАТЬ: Рад, что я сделал это одной строки. Но я проигрываю для Python. Поэтому это только для справки. Спасибо @Zgarb

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

Он принимает входные данные, создает список четности всех чисел от 1 до i. Затем устанавливает первый элемент в i в 101-sum (n) и печатает.

Попробуй здесь

TanMath
источник
3

Javascript ES6, 45 байт

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

Спасибо @Neil за 1 байт!

Mama Fun Roll
источник
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
Mama Fun Roll
источник
2

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

РЕДАКТИРОВАТЬ : Спасибо @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. Полученный список неявно печатается.

TanMath
источник
Это должно быть не более 17 байт:,R`2@%`M;Σ2╤u-0(T
quintopia
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).
ETHproductions
источник
1

ActionScript 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
andlrc
источник
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]
steenbergh
источник