กฎการจำหน่ายทั่วโลกของโจรสลัด


14

มี "เกม" ที่มีอยู่ซึ่งโจรสลัดแบ่งเหรียญทองอย่างมีเหตุผลตามกฎบางอย่าง ข้อความจากWikipedia :

มี 5 เหตุผลโจรสลัด A, B, C, D และ E พวกเขาพบ 100 เหรียญทอง พวกเขาต้องตัดสินใจว่าจะแจกจ่ายอย่างไร

โจรสลัดมีลำดับอาวุโสอย่างเข้มงวด: A เหนือกว่า B ซึ่งเหนือกว่า C ซึ่งเหนือกว่า D ซึ่งเหนือกว่า E

ดังนั้นกฎการกระจายทั่วโลกของโจรสลัดจึงเป็นที่ว่าโจรสลัดอาวุโสที่สุดควรเสนอการแจกเหรียญ โจรสลัดรวมถึงผู้เสนอนั้นลงคะแนนว่าจะยอมรับการกระจายนี้หรือไม่ ในกรณีที่มีคะแนนเสียงเท่ากันผู้ยื่นข้อเสนอจะต้องออกเสียงลงคะแนน หากการกระจายได้รับการยอมรับเหรียญจะถูกจ่ายออกไปและเกมจะสิ้นสุดลง หากไม่มีผู้เสนอจะถูกโยนลงน้ำจากเรือโจรสลัดและตายและโจรสลัดอาวุโสที่สุดคนต่อไปจะทำข้อเสนอใหม่เพื่อเริ่มระบบใหม่อีกครั้ง

Pirates ใช้การตัดสินใจของพวกเขาในสามปัจจัย ก่อนอื่นโจรสลัดแต่ละคนต้องการความอยู่รอด ประการที่สองการมีชีวิตอยู่รอดโจรสลัดแต่ละคนต้องการเพิ่มจำนวนเหรียญทองให้ได้มากที่สุด ประการที่สามโจรสลัดแต่ละคนต้องการที่จะโยนลงน้ำอีกครั้งหากผลลัพธ์อื่น ๆ ทั้งหมดจะเท่ากัน โจรสลัดไม่เชื่อใจซึ่งกันและกันและจะไม่ทำหรือให้เกียรติสัญญาใด ๆ ระหว่างโจรสลัดนอกเหนือจากแผนการแจกจ่ายที่เสนอซึ่งให้เหรียญทองจำนวนหนึ่งแก่โจรสลัดแต่ละคน

ท้าทาย

รับข้อมูลเป็นจำนวนเต็มn1 <= n <= 99 โดยที่nจำนวนโจรสลัด - และส่งออกการแจกเหรียญเริ่มต้นด้วยโจรสลัดคนแรก

กรณีทดสอบ (บรรทัดแรกคืออินพุตเอาต์พุตที่สอง):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

นี่คือดังนั้นทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ


1
ฉันคิดว่ามันถูกถามมาก่อน แต่ฉันไม่รู้จะหามันได้ที่ไหน
feersum

2
@feersum codegolf.stackexchange.com/questions/54235/… (ลบแล้ว)
Dennis

3
args [0] Java มีเหตุผลที่จะใช้สิ่งนี้
Addison Crump

3
ทำไมถึง จำกัดn < 100? เรือโจรสลัดที่ปิดทองจำนวนมากที่มีพนักงานไม่เพียงพอต้องได้รับความช่วยเหลือด้านการกระจายสินค้าเช่นกัน
Ryan Cavanaugh

1
@ นีลนั่นเป็นความคิดที่แย่มาก หากนั่นคือสิ่งที่ "เหตุผล" โจรสลัดทำดังนั้นโจรสลัดทั้งหมดที่ไม่ใช่ A จะพยายามฆ่า A เพื่อให้ได้ $ 100 / (n-1) $ แทน สิ่งนี้จะฆ่าทุกคนอย่างรวดเร็วยกเว้นโจรสลัดสองคนสุดท้าย
kaine

คำตอบ:


12

เยลลี่ , 11 10 ไบต์

R%2ḊµSȷ2_;

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียว

มันทำงานอย่างไร

สำหรับการป้อนข้อมูลnงานเดือดลงไปสร้างรายการx, 0, 1, 0, ...ของความยาวnที่มีผลรวมเป็น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.

7

Python ขนาด 33 ไบต์

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

คำนวณค่าแรกผนวกบาง0, 1, 0, 1..., nตัดทอนความยาว

โปรดทราบว่า-n/2+101ไม่สามารถลงไป101-n/2เพราะเอกและไบนารี-มีความสำคัญแตกต่างกัน: อดีตจะแยกเป็นและหลังเป็น(-n)/2101-(n/2)

การเรียกซ้ำนานกว่าเดิม (45):

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

4

MATLขนาด 12 ไบต์

:2\ts_101+l(

สิ่งนี้ใช้เวอร์ชันปัจจุบัน (9.2.2)ของภาษา / คอมไพเลอร์ซึ่งเร็วกว่าความท้าทายนี้

ตัวอย่าง

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

คำอธิบาย

:         % 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 62ไบต์

แก้ไข: ดีใจฉันทำให้มันเป็นหนึ่งซับ แต่ฉันแพ้ Python ดังนั้นนี่เป็นเพียงการอ้างอิง ขอบคุณ @Zarb

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

มันจะรับอินพุตสร้างรายการ pf parity ของตัวเลขทั้งหมดจาก 1 ถึง i จากนั้นตั้งค่าองค์ประกอบแรกใน i เป็น 101-sum (n) และงานพิมพ์

ลองที่นี่


3

Javascript ES6, 45 ไบต์

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

ขอบคุณ @Neil ที่บันทึกไว้ 1 ไบต์!


1
202-a>>1บันทึกเป็นไบต์
Neil

3

𝔼𝕊𝕄𝕚𝕟, 14 ตัวอักษร / 26 ไบต์

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

Try it here (Firefox only).

ไม่เลว แต่ก็ไม่ดีเหมือนกัน ...

คำอธิบาย

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

อย่างจริงจัง23 17 ไบต์

แก้ไข : ขอบคุณ @quintopia

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

ใช้วิธีการเดียวกันกับคำตอบ Python ของฉัน แต่ฉันทำ modulo 2 โดยใช้การแมปและหลายครั้งฉันหมุนสแต็กของฉัน

คำอธิบาย :

รหัสนี้พุชอินพุต (ฉันจะเรียกมันi) ถัดไปผลักดันrange(1,i+1)และทำให้ฟังก์ชั่น จากนั้นกด 2 หมุนสแต็กและสุดท้ายใช้โมดูโล

จากนั้นให้จับคู่ฟังก์ชันนี้กับช่วงที่ทำซ้ำได้ สิ่งนี้ให้ความเท่าเทียมกันของแต่ละองค์ประกอบในรายการ

ในที่สุดทำซ้ำสแต็คผลรวมรายการพาริตี้กด 2, 10 ^ 2 และ 100 + 1 และลบผลรวม (ขอผมเรียกค่านี้n) ถัดไปรหัสจะผลักดัน 0 หมุนสแต็กทีละ 1 และตั้งค่ารายการดัชนี 0 ขององค์ประกอบเป็น n รายการผลลัพธ์จะถูกพิมพ์โดยปริยาย


นี่ควรจะไม่เกิน 17 ไบต์:,R`2@%`M;Σ2╤u-0(T
quintopia

1

Japt, 14 ไบต์

อีกหนึ่งความท้าทายที่ฉันคิดว่าฉันอยากได้ในตัวฉันเพิ่งพิจารณาเพิ่ม ...

1oU mv u#Ê-UÁ1

ลองออนไลน์!

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

Actionscript 3, 87 ไบต์

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

มันไม่ใช่ภาษากอล์ฟที่ดีที่สุด แต่ฉันสนุกกับการโพสต์เป็น 3 คำตอบ



0

Perl 51 49 44 ไบต์

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

ต้องการตัวเลือก perlrun ต่อไปนี้ -E

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

0

QBIC , 28 25 ไบต์

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

คำอธิบาย

:               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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.