해적 세계의 분배 규칙


14

해적이 특정 규칙에 따라 합리적으로 금화를 나누는 기존 "게임"이 있습니다. Wikipedia 에서 인용 :

합리적인 해적 A, B, C, D 및 E가 있습니다. 그들은 100 개의 금화를 찾습니다. 배포 방법을 결정해야합니다.

해적들은 엄격한 연대 순서를 가지고있다 : A는 C보다 우월한, B보다 우월한, D보다 우월한, E보다 우월한 B보다 우월하다.

따라서 해적 세계의 분배 규칙은 다음과 같습니다. 가장 고위 해적은 동전 분배를 제안해야합니다. 제안자를 포함한 해적들은이 배포판을 받아 들일지 여부에 투표합니다. 동점 투표의 경우 제안자는 캐스팅 투표를합니다. 분배가 승인되면 코인이 지급되고 게임이 종료됩니다. 그렇지 않은 경우, 제안자는 해적선에서 배 밖으로 던져져 죽으며, 다음으로 가장 고위 해적은 시스템을 다시 시작하라는 새로운 제안을합니다.

해적은 세 가지 요소에 따라 결정을 내립니다. 우선, 각 해적은 생존하기를 원합니다. 둘째, 생존을 감안할 때, 각 해적은 각자받는 금화의 수를 최대화하려고합니다. 셋째, 다른 모든 결과가 다른 경우 각 해적은 다른 배 밖으로 던지는 것을 선호합니다. 해적들은 서로를 믿지 않으며, 제안 된 배포 계획을 제외하고 각 해적에게 많은 금화를주는 해적 간 약속을 지키거나 존중하지 않을 것입니다.

도전

정수로 입력하십시오 n. 1 <= n <= 99. 여기서 n해적의 수는-첫 번째 해적부터 시작하여 코인의 분포를 출력합니다.

테스트 사례 (첫 번째 줄이 입력되고 두 번째 출력) :

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

이것은 이므로 바이트 단위의 최단 솔루션이 이깁니다.


1
나는 이것이 이전에 요청되었다고 생각하지만 어디서 찾을 수 있을지 모른다.
feersum


3
Args [0]. Java는 이제 이것을 사용해야 할 이유가 있습니다.
애디슨 크럼

3
왜 제한 n < 100합니까? 직원이 많고 도금이되어 있지 않은 해적선도 배포 지원이 필요합니다.
Ryan Cavanaugh

1
@Neil 그것은 끔찍한 생각입니다. 그것이 "합리적인"해적들이하는 것이라면, A 이외의 모든 해적들은 A를 죽이려고 시도하여 대신에 $ 100 / (n-1) $을 얻습니다. 이것은 마지막 두 해적을 제외한 모든 사람을 빠르게 죽일 것입니다.
kaine

답변:


12

젤리 , 11 10 바이트

R%2ḊµSȷ2_;

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 한 번에 확인하십시오 .

작동 원리

입력 n의 경우, 작업 은 합계가 100 인 길이 n 의 목록 x, 0, 1, 0,… 을 생성합니다 .

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

파이썬, 33 바이트

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

첫 번째 값을 계산하고 일부를 추가 0, 1, 0, 1...하고 길이를 자릅니다.n .

참고 -n/2+101로 단축 할 수 없습니다 101-n/2단항 및 이진 때문에 -서로 다른 우선 순위를 가지고 : 이전과 같이 구문 분석 (-n)/2하고 후자 101-(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

파이썬, 62 58 바이트

편집 : 나는 그것을 하나의 라이너로 만들어서 다행입니다. 그러나 나는 파이썬을 잃습니다. 따라서 이것은 단지 참조 용입니다. 감사합니다 @Zgarb

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

입력을 받아 1에서 i까지의 모든 숫자의 목록 pf 패리티를 만듭니다. 그런 다음 i의 첫 번째 요소를 101-sum (n)으로 설정하고 인쇄합니다.

여기 사용해보십시오


3

자바 스크립트 ES6, 45 바이트

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

1 바이트 저장 @Neil 덕분에!


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

내 파이썬 답변과 동일한 접근 방식을 사용하지만 매핑을 사용하여 모듈로 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

apt, 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

액션 스크립트 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(" ")}

최고의 골프 ​​언어는 아니지만 as3 답변을 게시하는 것을 좋아합니다.



0

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.