Korsan dünyasının dağıtım kuralları


14

Korsanların rasyonel olarak altın paraları belirli kurallara göre böltüğü mevcut bir "oyun" var. Wikipedia'dan alıntı :

5 rasyonel korsan var, A, B, C, D ve E. 100 altın sikke buluyorlar. Onları nasıl dağıtacağına karar vermeliler.

Korsanların kesin bir kıdem sırası var: A, C'den üstün olan, D'den üstün, E'den üstün olan B'den üstündür.

Korsan dünyasının dağıtım kuralları şu şekildedir: en kıdemli korsan para dağıtımı önermelidir. Önerici de dahil olmak üzere korsanlar bu dağılımı kabul edip etmeyeceklerine oy verirler. Eşit oy durumunda teklif sahibinin oy kullanma hakkı vardır. Dağıtım kabul edilirse, paralar dağıtılır ve oyun sona erer. Aksi takdirde, öneri korsan gemisinden denize atılır ve ölür ve bir sonraki en kıdemli korsan sisteme tekrar başlamak için yeni bir teklifte bulunur.

Korsanlar kararlarını üç faktöre dayandırıyor. Her şeyden önce, her korsan hayatta kalmak istiyor. İkincisi, hayatta kalma göz önüne alındığında, her korsan her birinin aldığı altın sikke sayısını en üst düzeye çıkarmak istiyor. Üçüncüsü, diğer tüm sonuçlar eşit olursa, her korsan başka bir denize atmayı tercih eder. Korsanlar birbirlerine güvenmezler ve korsanlar arasında her korsan için bir dizi altın para veren önerilen bir dağıtım planı dışında ne vaatte bulunurlar ne de onurlandırmazlar.

Meydan okuma

Girdi olarak bir tamsayı alın n, 1 <= n <= 99, burada nkorsan sayısı - ve ilk korsandan başlayarak jetonların dağılımını çıkarın.

Test senaryoları (ilk satır girilir; ikinci çıkış):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Bu , bu nedenle bayttaki en kısa çözüm kazanır.


1
Sanırım bu daha önce sorulmuştu, ama nerede bulacağımı bilemezdim.
feersum


3
Args [0]. Java'nın bunu kullanmak için bir nedeni var.
Addison Crump

3
Neden sınır n < 100? Aşırı personel, yaldızlı korsan gemilerinin de dağıtım yardımına ihtiyacı var.
Ryan Cavanaugh

1
@Neil bu korkunç bir fikir. Eğer "rasyonel" korsanlar böyle yaparsa, A dışındaki tüm korsanlar A'yı öldürmeye çalışacaklar, bunun yerine 100 $ / (n-1) $ alacaklar. Bu son iki korsan hariç herkesi çabucak öldürecek.
kaine

Yanıtlar:


12

Jöle , 11 10 bayt

R%2ḊµSȷ2_;

Çevrimiçi deneyin! veya tüm test senaryolarını aynı anda doğrulayın .

Nasıl çalışır

N girdisi için , görev toplamı 100 olan n uzunluğundaki x, 0, 1, 0,… listesini oluşturmak için kaynar .

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.

7

Python, 33 bayt

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

İlk değeri hesaplar, bazılarını ekler 0, 1, 0, 1..., uzunluğa kısaltır n.

Not -n/2+101kısaltılmış edilemez 101-n/2tekli ve ikili nedeniyle -farklı önceliğe sahiptir: eski olarak ayrıştırılır (-n)/2ve olarak ikincisi 101-(n/2).

Özyineleme çok daha uzundu (45):

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

4

MATL , 12 bayt

:2\ts_101+l(

Bu , dilin / derleyicinin bu meydan okumadan daha önceki geçerli sürümünü (9.2.2) kullanır .

Misal

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

açıklama

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


3

Python, 62 58 bayt

EDIT: Tek gömlekli yaptığım için mutluyum. Ama Python için kaybettim. Bu nedenle, bu sadece referans içindir. Teşekkürler @Zgarb

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

Girdiyi alır, 1'den i'ye kadar tüm sayıların bir listesini oluşturur. Ardından, i'deki ilk öğeyi 101 toplamına (n) ayarlar ve yazdırır.

Burada deneyin


3

Javascript ES6, 45 bayt

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

@Neil sayesinde 1 bayt kaydedildi!


1
202-a>>1bir bayt kaydeder.
Neil

3

𝔼𝕊𝕄𝕚𝕟, 14 karakter / 26 bayt

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

Try it here (Firefox only).

Kötü değil, ama iyi de değil ...

açıklama

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

2

Ciddi, 23 17 bayt

EDIT : Teşekkürler @quintopia

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

Python cevabımla aynı yaklaşımı kullanır, ancak modulo 2'yi eşleme kullanarak yaparım ve birkaç kez yığınımı döndürürüm.

Açıklama :

Bu kod girişi iter (onu arayacağım i). Sonra iter range(1,i+1)ve bir işlev yapar. Sonra 2'yi iter, yığını döndürür ve son olarak modulo alır.

Ardından, bu işlevi yinelenebilir aralığa eşleyin. Bu listedeki her öğenin paritesini verir.

Son olarak, yığını çoğaltır, eşlik listesini toplar, 2, 10 ^ 2 ve 100 + 1 tuşlarına basar ve toplamı çıkarır (bu değeri aramama izin verin n). Daha sonra kod 0'ı iter, yığını 1 döndürür ve listenin dizin 0 öğesini n olarak ayarlar. Ortaya çıkan liste örtülü olarak yazdırılır.


Bu 17 bayttan fazla olmamalıdır:,R`2@%`M;Σ2╤u-0(T
quintopia

1

Japt, 14 bayt

Kendimi bir yerleşik için istekli bulduğum başka bir zorluk eklemeyi düşündüm ...

1oU mv u#Ê-UÁ1

Çevrimiçi deneyin!

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).

1

Actioncript 3, 87 bayt

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

En iyi golf dili değil, ama as3 cevap göndermekten hoşlanıyorum.



0

Perl 51 49 44 bayt

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

Aşağıdaki perlrun seçeneklerine ihtiyacınız var -E

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

0

QBIC , 28 25 bayt

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

açıklama

:               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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.