Zasady dystrybucji pirackiego świata

14

Istnieje „gra”, w której piraci racjonalnie dzielą złote monety zgodnie z pewnymi zasadami. Cytowanie z Wikipedii :

Jest 5 racjonalnych piratów, A, B, C, D i E. Znajdują 100 złotych monet. Muszą zdecydować, jak je rozpowszechniać.

Piraci mają ścisły porządek starszeństwa: A jest lepszy od B, który jest lepszy od C, który jest lepszy od D, który jest lepszy od E.

Zasady dystrybucji tego pirackiego świata są następujące: najbardziej zaawansowany pirat powinien zaproponować dystrybucję monet. Piraci, w tym wnioskodawca, głosują następnie, czy przyjąć tę dystrybucję. W przypadku remisu decydujący głos ma decydujący. Jeśli dystrybucja zostanie zaakceptowana, monety są wypłacane i gra się kończy. Jeśli nie, wnioskodawca zostaje wyrzucony za burtę ze statku pirackiego i umiera, a następny najstarszy pirat składa nową propozycję ponownego uruchomienia systemu.

Piraci opierają swoje decyzje na trzech czynnikach. Przede wszystkim każdy pirat chce przetrwać. Po drugie, biorąc pod uwagę przetrwanie, każdy pirat chce zmaksymalizować liczbę złotych monet, które każdy otrzymuje. Po trzecie, każdy pirat wolałby wyrzucić innego za burtę, jeśli w przeciwnym razie wszystkie inne wyniki byłyby równe. Piraci nie ufają sobie nawzajem i nie będą składać ani honorować żadnych obietnic między piratami oprócz proponowanego planu dystrybucji, który daje każdemu piratowi całą liczbę złotych monet.

Wyzwanie

Weź jako dane wejściowe liczbę całkowitą n, 1 <= n <= 99, gdzie njest liczba piratów - i wyślij dystrybucję monet, zaczynając od pierwszego pirata.

Przypadki testowe (wprowadzany jest pierwszy wiersz; drugi wynik):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

To jest , więc wygrywa najkrótsze rozwiązanie w bajtach.

andlrc
źródło
1
Myślę, że wcześniej o to pytano, ale nie wiedziałbym, gdzie to znaleźć.
feersum
2
@feersum codegolf.stackexchange.com/questions/54235/… (usunięty)
Dennis,
3
Args [0]. Java ma teraz powód, aby z tego korzystać.
Addison Crump
3
Po co ograniczać n < 100? Nadmiernie obsadzone, słabo pozłacane statki pirackie również potrzebują pomocy w dystrybucji.
Ryan Cavanaugh
1
@ Neil to okropny pomysł. Jeśli to właśnie robią „racjonalni” piraci, wówczas wszyscy piraci inni niż A będą próbowali zabić A, aby zamiast tego dostać 100 $ / (n-1) $. To szybko zabije wszystkich oprócz dwóch ostatnich piratów.
kaine

Odpowiedzi:

12

Galaretka , 11 10 bajtów

R%2ḊµSȷ2_;

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe jednocześnie .

Jak to działa

Dla wejścia n zadanie sprowadza się do utworzenia listy x, 0, 1, 0,… o długości n, której suma wynosi 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.
Dennis
źródło
7

Python, 33 bajty

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

Oblicza pierwszą wartość, dodaje niektóre 0, 1, 0, 1..., obcina do długości n.

Zauważ, że -n/2+101nie można go skracać, 101-n/2ponieważ jednoargumentowy i binarny -mają inny priorytet: pierwszy jest analizowany jako, (-n)/2a drugi jako 101-(n/2).

Rekursja była znacznie dłuższa (45):

f=lambda n,i=100:1/n*[i]or f(n-1,i-n%2)+[n%2]
xnor
źródło
4

MATL , 12 bajtów

:2\ts_101+l(

Używa bieżącej wersji (9.2.2) języka / kompilatora, która jest wcześniejsza niż to wyzwanie.

Przykład

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

Wyjaśnienie

:         % 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
Luis Mendo
źródło
3

Pyth, 13 bajtów

+-100sJ%R2tQJ

Zestaw testowy .

lirtosiast
źródło
3

Python, 62 58 bajtów

EDYCJA: Cieszę się, że zrobiłem to z jednej linii. Ale przegrywam dla Pythona. Dlatego jest to tylko w celach informacyjnych. Dzięki @Zgarb

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

Pobiera dane wejściowe, tworzy listę parzystości wszystkich liczb od 1 do i. Następnie ustawia pierwszy element w i na 101-sum (n) i drukuje.

Wypróbuj tutaj

TanMath
źródło
3

JavaScript ES6, 45 bajtów

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

Dzięki @Neil za 1 bajt zapisany!

Mama Fun Roll
źródło
1
202-a>>1zapisuje bajt.
Neil
3

𝔼𝕊𝕄𝕚𝕟, 14 znaków / 26 bajtów

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

Try it here (Firefox only).

Nieźle, ale też nie dobrze ...

Wyjaśnienie

⩥ï⒨?‡$%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
źródło
2

Poważnie, 23 17 bajtów

EDYCJA : Dzięki @ quintopia

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

Używa tego samego podejścia co moja odpowiedź w Pythonie, ale robię modulo 2 używając mapowania i kilka razy obracam mój stos.

Objaśnienie :

Ten kod popycha dane wejściowe (nazywam je i). Następnie popycha range(1,i+1)i wykonuje funkcję. Następnie popycha 2, obraca stos i w końcu bierze modulo.

Następnie przypisz tę funkcję do iterowalnego zakresu. Daje to parzystość każdego elementu na liście.

Na koniec duplikuje stos, sumuje listę parzystości, wypycha 2, 10 ^ 2 i 100 + 1 i odejmuje sumę (pozwól mi nazwać tę wartość n). Następnie kod wypycha 0, obraca stos o 1 i ustawia element 0 na liście na n. Wynikowa lista jest domyślnie drukowana.

TanMath
źródło
Powinno to być nie więcej niż 17 bajtów:,R`2@%`M;Σ2╤u-0(T
kwintopia
1

Japt, 14 bajtów

Kolejne wyzwanie, w którym pragnę wbudowanego urządzenia, właśnie rozważałem dodanie ...

1oU mv u#Ê-UÁ1

Wypróbuj online!

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).
ETHprodukcje
źródło
1

ActionScript 3, 87 bajtów

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

To nie jest najlepszy język golfa, ale lubię publikować odpowiedzi as3.

Brian
źródło
0

Perl 51 49 44 bajtów

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

Potrzebujesz następujących opcji Perlrun -E

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

QBIC , 28 25 bajtów

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

Wyjaśnienie

:               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
źródło