Aturan distribusi dunia bajak laut

14

Ada "permainan" yang ada di mana bajak laut secara rasional membagi koin emas sesuai aturan tertentu. Mengutip dari Wikipedia :

Ada 5 perompak yang rasional, A, B, C, D, dan E. Mereka menemukan 100 koin emas. Mereka harus memutuskan bagaimana cara mendistribusikannya.

Perompak memiliki urutan senioritas yang ketat: A lebih unggul dari B, yang lebih tinggi dari C, yang lebih tinggi dari D, yang lebih tinggi dari E.

Aturan distribusi dunia bajak laut adalah: bahwa bajak laut paling senior harus mengusulkan distribusi koin. Perompak, termasuk pengusul, kemudian memilih apakah akan menerima distribusi ini. Dalam hal suara seri, pengusul memiliki suara casting. Jika distribusi diterima, koin dicairkan dan permainan berakhir. Jika tidak, pengusul dilempar ke laut dari kapal bajak laut dan mati, dan bajak laut paling senior berikutnya membuat proposal baru untuk memulai sistem lagi.

Bajak laut mendasarkan keputusan mereka pada tiga faktor. Pertama-tama, setiap bajak laut ingin bertahan hidup. Kedua, mengingat kelangsungan hidup, setiap bajak laut ingin memaksimalkan jumlah koin emas yang diterima masing-masing. Ketiga, masing-masing bajak laut akan lebih suka membuang yang lain ke laut, jika semua hasil lainnya akan sama. Perompak tidak saling mempercayai, dan tidak akan membuat atau menghormati janji antara perompak selain dari rencana distribusi yang diusulkan yang memberikan sejumlah koin emas untuk masing-masing perompak.

Tantangan

Ambil sebagai bilangan bulat n, 1 <= n <= 99, di mana njumlah bajak laut - dan output distribusi koin, dimulai dengan bajak laut pertama.

Kasus uji (baris pertama adalah input; output kedua):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Ini adalah , jadi solusi terpendek dalam byte menang.

andlrc
sumber
1
Saya pikir ini ditanyakan sebelumnya, tetapi saya tidak tahu di mana menemukannya.
feersum
3
Args [0]. Java sekarang memiliki alasan untuk menggunakan ini.
Addison Crump
3
Mengapa membatasi n < 100? Kapal bajak laut yang terlalu banyak staf dan kurang disepuh membutuhkan bantuan distribusi juga.
Ryan Cavanaugh
1
@ Neil itu ide yang buruk. Jika itu yang dilakukan perompak "rasional", maka semua perompak selain A akan mencoba membunuh A sehingga mereka mendapatkan $ 100 / (n-1) $ sebagai gantinya. Ini akan dengan cepat membunuh semua orang kecuali dua perompak terakhir.
kaine

Jawaban:

12

Jelly , 11 10 byte

R%2ḊµSȷ2_;

Cobalah online! atau verifikasi semua kasus uji sekaligus .

Bagaimana itu bekerja

Untuk input n , tugas bermula untuk membuat daftar x, 0, 1, 0,… panjang n yang jumlahnya 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
sumber
7

Python, 33 byte

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

Menghitung nilai pertama, menambahkan beberapa 0, 1, 0, 1..., memotong panjang n.

Catatan yang -n/2+101tidak dapat disingkat menjadi 101-n/2karena unary dan binary -memiliki prioritas yang berbeda: yang pertama diuraikan sebagai (-n)/2dan yang terakhir sebagai 101-(n/2).

Rekursi jauh lebih lama (45):

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

MATL , 12 byte

:2\ts_101+l(

Ini menggunakan versi saat ini (9.2.2) dari bahasa / kompiler, yang lebih awal dari tantangan ini.

Contoh

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

Penjelasan

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

Pyth, 13 byte

+-100sJ%R2tQJ

Suite uji .

lirtosiast
sumber
3

Python, 62 58 byte

EDIT: Senang saya membuatnya satu-liner. Tapi saya kalah untuk Python. Karena itu, ini hanya untuk referensi. Terima kasih @Zgarb

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

Dibutuhkan input, membuat paritas daftar semua angka dari 1 hingga i. Kemudian atur elemen pertama di i ke 101-sum (n) dan cetak.

Coba di sini

TanMath
sumber
3

Javascript ES6, 45 byte

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

Terima kasih kepada @Neil selama 1 byte yang disimpan!

Mama Fun Roll
sumber
1
202-a>>1menghemat satu byte.
Neil
3

𝔼𝕊𝕄𝕚𝕟, 14 karakter / 26 byte

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

Try it here (Firefox only).

Tidak buruk, tapi juga tidak baik ...

Penjelasan

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

Serius, 23 17 byte

EDIT : Terima kasih @quintopia

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

Menggunakan pendekatan yang sama dengan jawaban Python saya, tetapi saya melakukan modulo 2 menggunakan pemetaan, dan beberapa kali, saya memutar tumpukan saya.

Penjelasan :

Kode ini mendorong input (saya akan menyebutnya i). Selanjutnya mendorong range(1,i+1)dan membuat suatu fungsi. Kemudian mendorong 2, memutar tumpukan, dan akhirnya mengambil modulo.

Selanjutnya, petakan fungsi ini ke rentang yang dapat diubah. Ini memberikan paritas dari setiap elemen dalam daftar.

Akhirnya, duplikat tumpukan, jumlah daftar paritas, tekan 2, 10 ^ 2, dan 100 + 1, dan kurangi jumlahnya (saya sebut nilai ini n). Selanjutnya kode mendorong 0, memutar tumpukan dengan 1, dan menetapkan elemen indeks 0 daftar ke n. Daftar yang dihasilkan dicetak secara implisit.

TanMath
sumber
Ini tidak boleh lebih dari 17 byte:,R`2@%`M;Σ2╤u-0(T
kuintopia
1

Japt, 14 byte

Namun tantangan lain di mana saya menemukan diri saya berharap untuk built-in yang baru saja saya pertimbangkan untuk menambahkan ...

1oU mv u#Ê-UÁ1

Cobalah 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).
Produksi ETH
sumber
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(" ")}

Ini bukan bahasa golf terbaik, tapi saya senang memposting jawaban as3.

Brian
sumber
0

Perl 51 49 44 byte

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

Perlu opsi perlrun berikut -E

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

QBIC , 28 25 byte

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

Penjelasan

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