海賊世界の流通ルール


14

海賊が特定のルールに従って金貨を合理的に分割する既存の「ゲーム」があります。ウィキペディアからの引用:

5人の合理的な海賊A、B、C、D、Eがいます。100人の金貨を見つけます。配布方法を決定する必要があります。

海賊には厳格な年功序列があります。AはBより優れ、BはCより優れ、DはDより優れ、EはEより優れています。

したがって、海賊世界の配布ルールは次のとおりです。最も上級の海賊はコインの配布を提案する必要があります。提案者を含む海賊は、この配布を受け入れるかどうかについて投票します。同数の投票の場合、提案者はキャスティング票を持ちます。配布が受け入れられると、コインは支払われ、ゲームは終了します。そうでない場合、提案者は海賊船から船外に投げ出されて死亡し、次に上級の海賊がシステムを再び開始するための新しい提案を行います。

海賊は、3つの要素に基づいて決定を下します。まず、各海賊は生き残りたいと思っています。第二に、生き残りを考えると、各海賊はそれぞれが受け取る金貨の数を最大にしたいと考えています。第三に、他のすべての結果が同じでなければ、各海賊は別の船外機を投げることを好むでしょう。海賊はお互いを信頼せず、各海賊に全数の金貨を提供する提案された配布計画を除き、海賊間の約束を立てたり、尊重したりしません。

チャレンジ

入力として整数n1 <= n <= 99をn取得します。これは海賊の数です。最初の海賊から始めて、コインの分布を出力します。

テストケース(最初の行が入力、2番目の出力):

1
100

2
100 0

3
99 0 1

5
98 0 1 0 1

これはであるため、バイト単位の最短の解決策が優先されます。


1
これは以前に尋ねられたと思いますが、どこにあるのかわかりません。
-feersum


3
Args [0]。Javaにはこれを使用する理由があります。
アディソンクランプ

3
なぜ限界n < 100?人員が多く、金メッキが施されていない海賊船も同様に配布の助けが必要です。
ライアンキャバノー

1
@Neilそれはひどいアイデアです。それが「合理的な」海賊の行為である場合、A以外のすべての海賊はAを殺そうとするので、代わりに$ 100 /(n-1)$を受け取ります。これにより、最後の2人の海賊を除く全員がすぐに殺されます。
ケイン

回答:


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

Python、33バイト

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

最初の値を計算し、someを追加して0, 1, 0, 1...、lengthに切り捨て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

Python、62 58バイト

編集:うれしいことに、私はそれをワンライナーにした。しかし、私はPythonを失います。したがって、これは参照用です。ありがとう@Zgarb

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

入力を取得し、1からiまでのすべての数値のパリティを含むリストを作成します。次に、iの最初の要素を101-sum(n)に設定して印刷します。

ここで試してみてください



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の答えと同じアプローチを使用しますが、マッピングを使用してモジュロ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

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