Các quy tắc phân phối của thế giới cướp biển


14

Có một "trò chơi" hiện có, nơi những tên cướp biển hợp lý phân chia tiền vàng theo các quy tắc nhất định. Trích dẫn từ Wikipedia :

Có 5 tên cướp biển hợp lý, A, B, C, D và E. Họ tìm thấy 100 đồng vàng. Họ phải quyết định cách phân phối chúng.

Những tên cướp biển có một trật tự nghiêm ngặt về thâm niên: A vượt trội hơn B, vượt trội hơn C, vượt trội so với D, vượt trội so với E.

Do đó, các quy tắc phân phối của thế giới cướp biển là: những tên cướp biển cao cấp nhất nên đề xuất phân phối tiền xu. Những tên cướp biển, bao gồm cả người đề xuất, sau đó bỏ phiếu về việc có chấp nhận phân phối này hay không. Trong trường hợp cà vạt bỏ phiếu, người đề xuất có phiếu bầu. Nếu phân phối được chấp nhận, tiền được giải ngân và trò chơi kết thúc. Nếu không, người đề xuất bị ném xuống biển từ tàu cướp biển và chết, và tên cướp biển cao cấp nhất tiếp theo đưa ra một đề xuất mới để bắt đầu lại hệ thống.

Cướp biển quyết định dựa trên ba yếu tố. Trước hết, mỗi tên cướp biển muốn sống sót. Thứ hai, cho sự sống còn, mỗi tên cướp biển muốn tối đa hóa số lượng tiền vàng mỗi lần nhận được. Thứ ba, mỗi tên cướp biển sẽ thích ném một tàu khác, nếu tất cả các kết quả khác sẽ bằng nhau. Những tên cướp biển không tin tưởng lẫn nhau, và sẽ không thực hiện bất kỳ lời hứa nào giữa những tên cướp biển ngoài kế hoạch phân phối được đề xuất cung cấp toàn bộ số lượng vàng cho mỗi tên cướp biển.

Thử thách

Lấy đầu vào là một số nguyên n, 1 <= n <= 99, trong đó nsố lượng cướp biển - và xuất ra phân phối tiền, bắt đầu với cướp biển đầu tiên.

Các trường hợp thử nghiệm (dòng đầu tiên là đầu vào; đầu ra thứ hai):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

Đây là , vì vậy giải pháp ngắn nhất tính bằng byte sẽ thắng.


1
Tôi nghĩ rằng điều này đã được hỏi trước đây, nhưng tôi sẽ không biết tìm nó ở đâu.
frageum


3
Luận điểm [0]. Java bây giờ có một lý do để sử dụng điều này.
Addison Crump

3
Tại sao lại giới hạn n < 100? Các tàu cướp biển quá hạn, thiếu nhân viên cũng cần sự giúp đỡ phân phối.
Ryan Cavanaugh

1
@Neil đó là một ý tưởng khủng khiếp. Nếu đó là những gì cướp biển "hợp lý" làm, thì tất cả những tên cướp biển khác ngoài A sẽ cố gắng giết A để họ nhận được $ 100 / (n-1) $ thay thế. Điều này sẽ nhanh chóng tiêu diệt tất cả mọi người trừ hai tên cướp biển cuối cùng.
kaine

Câu trả lời:


12

Thạch , 11 10 byte

R%2ḊµSȷ2_;

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc .

Làm thế nào nó hoạt động

Đối với đầu vào n , tác vụ sẽ chuyển sang tạo danh sách x, 0, 1, 0, đường có độ dài n có tổng bằng 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 byte

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

Tính giá trị đầu tiên, nối thêm một số 0, 1, 0, 1..., cắt ngắn theo chiều dài n.

Lưu ý rằng -n/2+101không thể rút ngắn 101-n/2vì đơn nguyên và nhị phân -có quyền ưu tiên khác nhau: cái trước được phân tích cú pháp (-n)/2và cái sau là 101-(n/2).

Đệ quy dài hơn nhiều (45):

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

4

MATL , 12 byte

:2\ts_101+l(

Điều này sử dụng phiên bản hiện tại (9.2.2) của ngôn ngữ / trình biên dịch, sớm hơn thử thách này.

Thí dụ

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

Giải trình

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

EDIT: Vui mừng tôi đã làm cho nó một lót. Nhưng tôi thua Python. Do đó, đây chỉ là để tham khảo. Cảm ơn @Zgarb

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

Nó nhận đầu vào, tạo một danh sách chẵn lẻ pf của tất cả các số từ 1 đến i. Sau đó đặt phần tử đầu tiên trong i thành 101-sum (n) và in.

Hãy thử nó ở đây


3

Javascript ES6, 45 byte

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

Cảm ơn @Neil đã lưu 1 byte!


1
202-a>>1tiết kiệm một byte.
Neil

3

, 14 ký tự / 26 byte

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

Try it here (Firefox only).

Không tệ, nhưng cũng không tốt ...

Giải trình

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

Nghiêm túc, 23 17 byte

EDIT : Cảm ơn @quintopia

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

Sử dụng cách tiếp cận tương tự như câu trả lời Python của tôi, nhưng tôi thực hiện modulo 2 bằng cách sử dụng ánh xạ và nhiều lần, tôi xoay ngăn xếp của mình.

Giải thích :

Mã này đẩy đầu vào (tôi sẽ gọi nó i). Tiếp theo đẩy range(1,i+1)và làm cho một chức năng. Sau đó đẩy 2, xoay stack và cuối cùng lấy modulo.

Tiếp theo, ánh xạ chức năng này lên phạm vi lặp. Điều này mang lại tính chẵn lẻ của từng yếu tố trong danh sách.

Cuối cùng, nhân đôi ngăn xếp, tính tổng danh sách chẵn lẻ, đẩy 2, 10 ^ 2 và 100 + 1 và trừ tổng (hãy để tôi gọi giá trị này n). Tiếp theo mã đẩy 0, xoay ngăn xếp bằng 1 và đặt phần tử chỉ số 0 của danh sách thành n. Danh sách kết quả được in ngầm.


Điều này sẽ không quá 17 byte:,R`2@%`M;Σ2╤u-0(T
quintopia

1

Japt, 14 byte

Tuy nhiên, một thách thức khác mà tôi thấy mình mong muốn tích hợp sẵn, tôi vừa xem xét thêm ...

1oU mv u#Ê-UÁ1

Hãy thử trực tuyến!

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

Bản thảo 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(" ")}

Nó không phải là ngôn ngữ chơi golf tốt nhất, nhưng tôi thích đăng 3 câu trả lời.



0

Perl 51 49 44 byte

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

Cần các tùy chọn liên tục sau đây -E

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

0

QBIC , 28 25 byte

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

Giải trình

:               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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.