Les règles de distribution du monde pirate

14

Il existe un "jeu" existant où les pirates divisent rationnellement les pièces d'or selon certaines règles. Citation de Wikipedia :

Il y a 5 pirates rationnels, A, B, C, D et E. Ils trouvent 100 pièces d'or. Ils doivent décider comment les distribuer.

Les pirates ont un ordre d'ancienneté strict: A est supérieur à B, qui est supérieur à C, qui est supérieur à D, qui est supérieur à E.

Les règles de distribution du monde pirate sont donc les suivantes: que le pirate le plus âgé propose une distribution de pièces. Les pirates, y compris l'auteur de la proposition, votent ensuite sur l'acceptation de cette distribution. En cas d'égalité des voix, l'auteur de la proposition a voix prépondérante. Si la distribution est acceptée, les pièces sont déboursées et le jeu se termine. Sinon, le proposant est jeté par-dessus bord du bateau pirate et meurt, et le pirate le plus ancien suivant fait une nouvelle proposition pour redémarrer le système.

Les pirates fondent leurs décisions sur trois facteurs. Tout d'abord, chaque pirate veut survivre. Deuxièmement, compte tenu de la survie, chaque pirate souhaite maximiser le nombre de pièces d'or qu'il reçoit. Troisièmement, chaque pirate préférerait jeter un autre par-dessus bord, si tous les autres résultats étaient autrement égaux. Les pirates ne se font pas confiance et ne feront ni n'honoreront aucune promesse entre les pirates en dehors d'un plan de distribution proposé qui donne un nombre entier de pièces d'or à chaque pirate.

Défi

Prenez en entrée un entier n, 1 <= n <= 99, où nest le nombre de pirates - et sortez la distribution des pièces, en commençant par le premier pirate.

Cas de test (la première ligne est entrée; la deuxième sortie):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Il s'agit de , donc la solution la plus courte en octets l'emporte.

andlrc
la source
1
Je pense que cela a déjà été demandé, mais je ne sais pas où le trouver.
feersum
2
@feersum codegolf.stackexchange.com/questions/54235/… (supprimé)
Dennis
3
Args [0]. Java a maintenant une raison de l'utiliser.
Addison Crump
3
Pourquoi limiter n < 100? Les navires pirates surdimensionnés et sous-dorés ont également besoin d'une aide à la distribution.
Ryan Cavanaugh
1
@Neil, c'est une terrible idée. Si c'est ce que font les pirates "rationnels", alors tous les pirates autres que A essaieront de tuer A pour qu'ils obtiennent à la place 100 $ / (n-1) $. Cela tuera rapidement tout le monde sauf les deux derniers pirates.
kaine

Réponses:

12

Gelée , 11 10 octets

R%2ḊµSȷ2_;

Essayez-le en ligne! ou vérifiez tous les cas de test à la fois .

Comment ça fonctionne

Pour l'entrée n , la tâche se résume à créer la liste x, 0, 1, 0,… de longueur n dont la somme est 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
la source
7

Python, 33 octets

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

Calcule la première valeur, en ajoute 0, 1, 0, 1..., tronque à la longueur n.

Notez que -n/2+101cela ne peut pas être raccourci 101-n/2car unaire et binaire -ont une priorité différente: le premier est analysé comme (-n)/2et le second comme 101-(n/2).

La récursivité était beaucoup plus longue (45):

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

MATL , 12 octets

:2\ts_101+l(

Cela utilise la version actuelle (9.2.2) du langage / compilateur, qui est antérieure à ce défi.

Exemple

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

Explication

:         % 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
la source
3

Pyth, 13 octets

+-100sJ%R2tQJ

Suite de tests .

lirtosiast
la source
3

Python, 62 58 octets

EDIT: Heureux que j'en ai fait une doublure. Mais je perds pour Python. Par conséquent, c'est juste pour référence. Merci @Zgarb

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

Il prend l'entrée, crée une liste de parité pf de tous les nombres de 1 à i. Définit ensuite le premier élément de i à 101-sum (n) et imprime.

Essayez-le ici

TanMath
la source
3

Javascript ES6, 45 octets

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

Merci à @Neil pour 1 octet enregistré!

Mama Fun Roll
la source
1
202-a>>1enregistre un octet.
Neil
3

𝔼𝕊𝕄𝕚𝕟, 14 caractères / 26 octets

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

Try it here (Firefox only).

Pas mal, mais pas bon non plus ...

Explication

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

Sérieusement, 23 17 octets

EDIT : Merci @quintopia

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

Utilise la même approche que ma réponse Python, mais je fais le modulo 2 en utilisant le mappage, et plusieurs fois, je tourne ma pile.

Explication :

Ce code pousse l'entrée (je l'appellerai i). Pousse ensuite range(1,i+1)et crée une fonction. Pousse ensuite 2, fait pivoter la pile et prend finalement le modulo.

Ensuite, mappez cette fonction sur la plage itérable. Cela donne la parité de chaque élément de la liste.

Enfin, duplique la pile, additionne la liste de parité, pousse 2, 10 ^ 2 et 100 + 1 et soustrait la somme (permettez-moi d'appeler cette valeur n). Ensuite, le code pousse 0, fait pivoter la pile de 1 et définit l'élément d'index 0 de la liste sur n. La liste résultante est implicitement imprimée.

TanMath
la source
Cela ne devrait pas dépasser 17 octets:,R`2@%`M;Σ2╤u-0(T
quintopie
1

Japt, 14 octets

Encore un autre défi où je me retrouve à souhaiter un intégré que je venais d'envisager d'ajouter ...

1oU mv u#Ê-UÁ1

Essayez-le en ligne!

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
la source
1

Actionscript 3, 87 octets

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

Ce n'est pas la meilleure langue de golf, mais j'aime poster des réponses as3.

Brian
la source
0

Perl 51 49 44 octets

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

Besoin des options perlrun suivantes -E

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

QBIC , 28 25 octets

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

Explication

:               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
la source