Las reglas de distribución del mundo pirata

14

Existe un "juego" existente donde los piratas dividen racionalmente las monedas de oro de acuerdo con ciertas reglas. Citando de Wikipedia :

Hay 5 piratas racionales, A, B, C, D y E. Encuentran 100 monedas de oro. Deben decidir cómo distribuirlos.

Los piratas tienen un estricto orden de antigüedad: A es superior a B, superior a C, superior a D, superior a E.

Las reglas de distribución del mundo pirata son las siguientes: que el pirata más veterano debería proponer una distribución de monedas. Los piratas, incluido el proponente, votan si aceptan esta distribución. En caso de empate, el proponente tiene el voto de calidad. Si se acepta la distribución, las monedas se desembolsan y el juego termina. Si no, el proponente es arrojado por la borda del barco pirata y muere, y el siguiente pirata más veterano hace una nueva propuesta para comenzar el sistema nuevamente.

Los piratas basan sus decisiones en tres factores. En primer lugar, cada pirata quiere sobrevivir. En segundo lugar, dada la supervivencia, cada pirata quiere maximizar el número de monedas de oro que recibe cada uno. Tercero, cada pirata preferiría lanzar otro por la borda, si todos los demás resultados fueran iguales. Los piratas no confían el uno en el otro, y no harán ni cumplirán ninguna promesa entre piratas, aparte de un plan de distribución propuesto que otorgue un número entero de monedas de oro a cada pirata.

Desafío

Tome como entrada un número entero n, 1 <= n <= 99, donde nestá el número de piratas, y genere la distribución de monedas, comenzando con el primer pirata.

Casos de prueba (se ingresa la primera línea; la segunda salida):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Este es el , por lo que gana la solución más corta en bytes.

andlrc
fuente
1
Creo que esto se preguntó antes, pero no sabría dónde encontrarlo.
feersum
2
@feersum codegolf.stackexchange.com/questions/54235/… (eliminado)
Dennis el
3
Args [0]. Java ahora tiene una razón para usar esto.
Addison Crump
3
¿Por qué limitar n < 100? Los barcos piratas con exceso de personal y poco dorado también necesitan ayuda de distribución.
Ryan Cavanaugh
1
@Neil, esa es una idea terrible. Si eso es lo que hacen los piratas "racionales", entonces todos los piratas que no sean A intentarán matar a A para que obtengan $ 100 / (n-1) $ en su lugar. Esto matará rápidamente a todos, excepto a los dos últimos piratas.
kaine

Respuestas:

12

Jalea , 11 10 bytes

R%2ḊµSȷ2_;

Pruébalo en línea!o verificar todos los casos de prueba a la vez .

Cómo funciona

Para la entrada n , la tarea se reduce a crear la lista x, 0, 1, 0, ... de longitud n cuya suma es 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
fuente
7

Python, 33 bytes

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

Calcula el primer valor, agrega algunos 0, 1, 0, 1... , trunca a la longitud n.

Tenga en cuenta que -n/2+101no se puede acortar 101-n/2porque unario y binario -tienen una precedencia diferente: el primero se analiza como (-n)/2y el segundo como101-(n/2) .

La recursión fue mucho más larga (45):

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

MATL , 12 bytes

:2\ts_101+l(

Esto usa la versión actual (9.2.2) del lenguaje / compilador, que es anterior a este desafío.

Ejemplo

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

Explicación

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

Python, 62 58 bytes

EDITAR: Me alegro de haberlo hecho de una sola línea. Pero pierdo por Python. Por lo tanto, esto es solo para referencia. Gracias @Zgarb

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

Toma la entrada, crea una lista de paridad de todos los números del 1 al i. Luego establece el primer elemento en i en 101-sum (n) e imprime.

Pruébalo aquí

TanMath
fuente
3

Javascript ES6, 45 bytes

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

¡Gracias a @Neil por 1 byte guardado!

Mama Fun Roll
fuente
1
202-a>>1Guarda un byte.
Neil
3

𝔼𝕊𝕄𝕚𝕟, 14 caracteres / 26 bytes

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

Try it here (Firefox only).

No es malo, pero tampoco es bueno...

Explicación

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

En serio, 23 17 bytes

EDITAR : Gracias @quintopia

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

Utiliza el mismo enfoque que mi respuesta de Python, pero hago el módulo 2 usando mapeo, y varias veces, giro mi pila.

explicación :

Este código empuja la entrada (lo llamaré i). Luego empuja range(1,i+1)y hace una función. Luego empuja 2, gira la pila y finalmente toma el módulo.

A continuación, asigne esta función al rango iterable. Esto da la paridad de cada elemento en la lista.

Finalmente, duplica la pila, suma la lista de paridad, presiona 2, 10 ^ 2 y 100 + 1, y resta la suma (déjame llamar a este valor n). Luego, el código empuja 0, gira la pila en 1 y establece el elemento índice 0 de la lista en n. La lista resultante se imprime implícitamente.

TanMath
fuente
Esto no debe tener más de 17 bytes:,R`2@%`M;Σ2╤u-0(T
quintopia
1

Japt, 14 bytes

Sin embargo, otro desafío en el que me encuentro deseando un dispositivo incorporado que acababa de considerar agregar ...

1oU mv u#Ê-UÁ1

Pruébalo en línea!

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
fuente
1

Actionscript 3, 87 bytes

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

No es el mejor lenguaje de golf, pero me gusta publicar 3 respuestas.

Brian
fuente
0

Perl 51 49 44 bytes

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

Necesita las siguientes opciones de perlrun -E

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

QBIC , 28 25 bytes

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

Explicación

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