Die Verbreitungsregeln der Piratenwelt

14

Es gibt ein "Spiel", in dem Piraten Goldmünzen nach bestimmten Regeln rational aufteilen. Zitat aus Wikipedia :

Es gibt 5 rationale Piraten, A, B, C, D und E. Sie finden 100 Goldmünzen. Sie müssen entscheiden, wie sie verteilt werden.

Die Piraten haben eine strenge Rangordnung: A ist B überlegen, der C überlegen ist, der D überlegen ist, der E überlegen ist.

Die Verteilungsregeln der Piratenwelt lauten daher: Der älteste Pirat sollte eine Verteilung von Münzen vorschlagen. Die Piraten, einschließlich des Antragstellers, stimmen dann darüber ab, ob diese Verteilung akzeptiert werden soll. Bei Stimmengleichheit hat der Antragsteller die ausschlaggebende Stimme. Wenn die Verteilung akzeptiert wird, werden die Münzen ausgezahlt und das Spiel endet. Wenn nicht, wird der Antragsteller vom Piratenschiff über Bord geworfen und stirbt, und der nächsthöhere Pirat macht einen neuen Vorschlag, das System erneut zu starten.

Piraten stützen ihre Entscheidungen auf drei Faktoren. Zunächst möchte jeder Pirat überleben. Zweitens möchte jeder Pirat bei gegebenem Überleben die Anzahl der Goldmünzen, die er erhält, maximieren. Drittens würde jeder Pirat lieber einen anderen über Bord werfen, wenn alle anderen Ergebnisse gleich wären. Die Piraten vertrauen sich nicht und werden keine Versprechungen zwischen Piraten machen oder einlösen, abgesehen von einem vorgeschlagenen Verteilungsplan, der jedem Piraten eine ganze Anzahl von Goldmünzen gibt.

Herausforderung

Nehmen Sie als Eingabe eine ganze Zahl n, 1 <= n <= 99, wobei ndie Anzahl der Piraten ist - und geben Sie die Verteilung der Münzen aus, beginnend mit dem ersten Piraten.

Testfälle (erste Zeile ist Eingabe; zweite Ausgabe):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Das ist , also gewinnt die kürzeste Lösung in Bytes.

undlrc
quelle
1
Ich glaube, das wurde schon einmal gefragt, aber ich würde nicht wissen, wo ich es finden kann.
Feersum
2
@feersum codegolf.stackexchange.com/questions/54235/… (gelöscht)
Dennis
3
Args [0]. Java hat jetzt einen Grund, dies zu verwenden.
Addison Crump
3
Warum einschränken n < 100? Überbesetzte, untervergoldete Piratenschiffe benötigen ebenfalls Verteilungshilfe.
Ryan Cavanaugh
1
@Neil das ist eine schreckliche Idee. Wenn es das ist, was "vernünftige" Piraten tun, werden alle Piraten außer A versuchen, A zu töten, so dass sie stattdessen $ 100 / (n-1) $ erhalten. Dadurch werden alle außer den letzten beiden Piraten schnell getötet.
Kaine

Antworten:

12

Jelly , 11 bis 10 Bytes

R%2ḊµSȷ2_;

Probieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .

Wie es funktioniert

Für die Eingabe n läuft die Aufgabe darauf hinaus, die Liste x, 0, 1, 0, ... mit der Länge n zu erstellen , deren Summe 100 ist .

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
quelle
7

Python, 33 Bytes

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

Berechnet den ersten Wert, hängt einige an 0, 1, 0, 1...und schneidet die Länge ab n.

Beachten Sie, dass -n/2+101dies nicht abgekürzt werden kann, 101-n/2da Unär und Binär -unterschiedliche Priorität haben: Ersteres wird analysiert als (-n)/2und Letzteres als 101-(n/2).

Die Rekursion war viel länger (45):

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

MATL , 12 Bytes

:2\ts_101+l(

Hierbei wird die aktuelle Version (9.2.2) der Sprache / des Compilers verwendet, die älter ist als diese Herausforderung.

Beispiel

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

Erläuterung

:         % 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
quelle
3

Pyth, 13 Bytes

+-100sJ%R2tQJ

Testsuite .

Lirtosiast
quelle
3

Python, 62 58 Bytes

EDIT: Ich bin froh, dass ich es zu einem Einzeiler gemacht habe. Aber ich verliere für Python. Daher dient dies nur als Referenz. Danke @Zgarb

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

Es nimmt die Eingabe entgegen und erstellt eine Liste mit Paritäten aller Zahlen von 1 bis i. Setzt dann das erste Element in i auf 101-sum (n) und druckt.

Probieren Sie es hier aus

TanMath
quelle
3

Javascript ES6, 45 Bytes

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

Danke an @Neil für 1 Byte gespeichert!

Mama Fun Roll
quelle
1
202-a>>1Speichert ein Byte.
Neil
3

𝔼𝕊𝕄𝕚𝕟 14 Zeichen / 26 Byte

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

Try it here (Firefox only).

Nicht schlecht, aber auch nicht gut ...

Erläuterung

⩥ï⒨?‡$%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
quelle
2

Im Ernst, 23 17 Bytes

EDIT : Danke @quintopia

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

Verwendet den gleichen Ansatz wie meine Python-Antwort, aber ich mache das Modulo 2 mit Mapping und drehe meinen Stapel mehrmals.

Erklärung :

Dieser Code drückt die Eingabe (ich werde es nennen i). Weiter drückt range(1,i+1)und macht eine Funktion. Dann drückt 2, dreht Stapel und nimmt schließlich Modulo.

Als nächstes ordnen Sie diese Funktion dem iterierbaren Bereich zu. Dies gibt die Parität jedes Elements in der Liste an.

Zum Schluss duplizieren Sie den Stapel, summieren die Paritätsliste, drücken 2, 10 ^ 2 und 100 + 1 und subtrahieren die Summe (nennen wir diesen Wert n). Als nächstes drückt der Code 0, dreht den Stapel um 1 und setzt das Index 0-Element der Liste auf n. Die resultierende Liste wird implizit gedruckt.

TanMath
quelle
Dies sollte nicht mehr als 17 Bytes sein:,R`2@%`M;Σ2╤u-0(T
Quintopia
1

Japt, 14 Bytes

Eine weitere Herausforderung, bei der ich mir ein eingebautes Gerät wünsche, das ich gerade hinzugefügt habe ...

1oU mv u#Ê-UÁ1

Probieren Sie es 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).
ETHproductions
quelle
1

Actionscript 3, 87 Byte

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

Es ist nicht die beste Golfsprache, aber ich poste gerne as3 Antworten.

Brian
quelle
0

Perl 51 49 44 Bytes

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

Benötige die folgenden Perlrun-Optionen -E

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

QBIC , 28 25 Bytes

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

Erläuterung

:               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
quelle