リスクバトル:ダウンする


16

Riskでの戦闘のための2つのサイコロのリストを考えると、プログラムまたは機能は、各プレイヤーが失う軍隊の数を出力する必要があります。

バックグラウンド

あなたはこれを読む必要はありません。それは単なる背景です。「タスク」の小見出しにスキップして、衰えずに続行します。

リスクのゲームでは、1人のプレイヤーが別のプレイヤーを攻撃できます(実際、これは勝つために必要です)。戦闘の結果は、サイコロの出目によって決まります。すべてのバトルは、各プレイヤーが最大で負けるサブバトルの連続として発生します2で軍隊のピースます。

サブバトルでは、ディフェンダーとアタッカーはそれぞれ、このチャレンジとは無関係の状況に基づいて数が異なる可能性のあるいくつかのサイコロを振ります。攻撃者の最も価値のあるダイスは、防御者の最も価値のあるダイスと比較されます。攻撃者のダイスが防御者のダイスよりも高い場合、防御者は1ピースを失います。それ以外の場合、攻撃者は1つのピースを失います。

次に、両方のプレイヤーが少なくとも2つのサイコロを持っている場合、2人のプレイヤーの2番目に高いサイコロが比較されます。繰り返しますが、攻撃者のダイスが防御者のダイスよりも高い場合、防御者は1ピースを失います。それ以外の場合、攻撃者は1つのピースを失います。

(防御側が同点を勝ち取ります。防御側と攻撃側の両方がをロールした4場合、攻撃側は駒を失います。)

サイコロの比較

ウィキペディアの記事のこのサブバトルでは、攻撃者のサイコロは赤で、防御者のサイコロは白です。攻撃者のサイコロ4の最高値はであり、防御者のサイコロの最高値は3です。攻撃側の方が高かったため、防御側はピースを失います。二番目に高い3、攻撃者と2防御者です。攻撃者が再び高くなったため、防御者は別のピースを失います。したがって、このサブバトルでは、攻撃者はピースを失いませんし、防御者は2ピースを失います。

3番目に高い部分は比較されないことに注意してください。これは、ディフェンダーが1つのサブバトルで2つ以下のサイコロを持っているため、これまでに比較する3番目に高いピースがないためです。

仕事

リスクのサブバトルの攻撃者と防御者の両方の任意の便利な形式の未分類のサイコロ(1〜6の範囲の整数)を考慮して、各プレイヤーが失う軍隊の数を出力します。5つの可能性を示すさまざまな出力がある限り、出力は任意の便利な形式にすることができます。質問には、これらの異なる出力が何であるかを示す必要があります。

出力は次のように決定されます。開始とdef=0atk=0。攻撃者のさいころのリストの最大値が、防御者のさいころのリストの最大値よりも大きい場合、増分しますdef。それ以外の場合、インクリメントしますatk

サイコロの両方のリストの長さが少なくとも2である場合:攻撃者のサイコロのリストの2番目に大きい値がリストの2番目に大きい値よりも大きい場合、インクリメントしdef、そうでなければインクリメントするatk

最後に、プログラムまたは関数は、次の5つの出力候補のそれぞれに対して一意の識別子を出力する必要があります。

  ╔═══╦═══╗
  ║atk║def║
  ╠═══╬═══╣
  ║ 1 ║ 0 ║
  ║ 0 ║ 1 ║
  ║ 2 ║ 0 ║
  ║ 1 ║ 1 ║
  ║ 0 ║ 2 ║
  ╚═══╩═══╝

防御者:[3, 2] 攻撃者:[2, 4, 1]防御3者の最大値と攻撃者の最大値はです44>3のでdef=1 、防御側の22番目は攻撃側の2番目です2Not(2>2)、そうatk=1。出力は次のようになります[1,1]

テストケース

Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]

サンプル実装

Python 2または3

def risk(atk_rolls,def_rolls):
    # set the rolls in descending order, e.g. [5,3,2]
    atk_rolls = sorted(atk_rolls,reverse = True)
    def_rolls = sorted(def_rolls,reverse = True)
    # minimum length.
    minlen = min(len(atk_rolls),len(def_rolls))
    atk_lost = 0
    def_lost = 0
    # compare the highest-valued rolls
    if atk_rolls[0]>def_rolls[0]:
        def_lost += 1
    else:
        atk_lost += 1
    if minlen == 2:
        # compare the second-highest-valued rolls
        if atk_rolls[1] > def_rolls[1]:
            def_lost += 1
        else:
            atk_lost += 1
    return [def_lost, atk_lost]    

仕様書

  • 入力は、のみを明確にエンコードする任意の形式として解釈できます、防御側のロールと攻撃側のロール。
  • 出力は、上記の5つの可能性のそれぞれに対して一意の出力を提供する任意の形式にすることができます。
  • ディフェンダーのロールは、セット内のリスト1または2整数[1,2,3,4,5,6]です。攻撃者のロールがリストされている13セットで整数[1,2,3,4,5,6]
  • これはなので、各言語で最短のコード優先されます!ゴルフ言語での回答が他の言語での回答の投稿を妨げないようにしてください。

サンドボックスでこれを見た、いい質問
ノアクリスティーノ


最大ロールが防御側の最高ロールと等しい場合、攻撃者は負けますよね?
ミスターXcoder

1
はい、@ Mr.Xcoder、ディフェンダーが同点となります。
-fireflame241

したがって、コメントを削除しました:)
Xcoder氏17

回答:


8

NANDゲート、237

Logisimで 作成

入力は3ビットの符号なしバイナリで、左側に入力されます。出力(2ビット)は右側にあります。

画面に収まるには大きすぎるため、Logisimはズームできないため、画像は白黒になります。ごめんなさい :(

すべてのテストケースで機能します。

メモリ回路を使用してこれを行うより良い方法があり、大きなセクションを再利用できます。


4

ゼリー 12  11 バイト

NṢ€>/Ṡḟ-o-S

Defender, Attackerロールのリスト(それぞれリスト)を取り、その間の整数-22含むモナドリンク(ディフェンダー損失-攻撃者損失):

result : [def, atk]
    -2 : [  0,   2]
    -1 : [  0,   1]
     0 : [  1,   1]
     1 : [  1,   0]
     2 : [  2,   0]

オンラインでお試しください!または、テストスイート(結果をOP形式にマッピングする)を参照してください。

どうやって?

NṢ€>/Ṡḟ-o-S - Link: list [list Def, list Atk]
N           - negate all the rolls
 Ṣ€         - sort €ach of the lists of -1*rolls (max rolls are to the left now)
    /       - reduce by:
   >        -   is greater than?  (when len(Atk) > len(Def) leaves trailing negatives)
     Ṡ      - sign (maps all negatives to -1; zeros and ones of comparison unchanged)
       -    - literal -1
      ḟ     - filter discard (remove the -1s)
         -  - literal -1
        o   - logical or, vectorises (replaces the zeros with minus ones)
          S - sum

2

網膜、82バイト

%O^`.
((.)+).*(¶(?<-2>.)+)(?(2)(?!)).*
$1$3
O$`.
$.%`
\d
$*1D
(1+)D1*\1

1+D
A
O`.

オンラインでお試しください!入力の最初の行は攻撃者のサイコロで、2番目の行は防御者のサイコロです。(別の行に)戻りAAADDDA又はD必要に応じて。



2

MATL、23バイト

oH2$S1&Y)Y&t1M>t~b,Y&sD

オンラインでお試しください!

防御側が攻撃側よりも多くのサイコロを許可されている理由は定かではありませんが、私はリスクにあまり精通していないかもしれません。コアプログラムはちょうど>t~,sDで、他のすべてのバイトは異なる入力長に対応するためにあり、少しの並べ替えが行われます。入力は攻撃者、防御者、出力は攻撃者の損失、防御者の損失です。

o    % Convert input to numeric array, padding with zeroes 
H2$S % Sort row-wise (specified to prevent 1v1 sorting)
1&Y) % Split attacker/defender
Y&t  % Logical and to filter out excess dice. Duplicate for 'do twice' later.
1M>  % Get throws again, decide who won
t~   % And the inverse to decide who lost
b,   % Bubble filter to the top. Do twice:
  Y& % Apply filter
  sD % Sum of losses. Display.

2

JavaScript(SpiderMonkey)97 83 78バイト

d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++
return[u,v]}

オンラインでお試しください!

-4バイト、@ ovsと@Craig Ayreの
おかげで修正-1バイト@Shaggyのおかげで


1人の攻撃者が2人の防御者に対して機能しません。
ニール

うーん、私はそれについて考えませんでした。私はそれを修正します
ワッフルコーン

2
これはうまくいくかもしれません。
-ovs

@ovsのソリューションはすべてのテストケースに合格し、数バイトも節約できます(tioリンクが大きすぎます):d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
クレイグエア

最初の改行は不要で、1バイトかかります。
シャギー

2

、10バイト

M#eI¬¤z>Ö>

オンラインでお試しください!

ロールの2つの別個のリストとして入力し、opのように出力します。

説明

¤z>Ö> 各リストを降順でソートし、対応する要素を比較してそれらを圧縮します(より長いリストを切り捨てます)。

M#eI¬真理値(同一性による)と偽値(論理否定による)のeカウント(#)で2要素リスト()をI作成します¬


1

Perl 5、66 + 1(-a)= 67バイト

@A=sort split/ /,<>;$b+=@A?pop@A>$_?-1:1:0for reverse sort@F;say$b

オンラインでお試しください!

入力:

2行。1行目は防御側(プレイヤー1)、2行目は攻撃側(プレイヤー2)です。スペースで区切られた個々のロール。

出力:

防御側の強さと攻撃側の効果的な変化を示します。

Output Attacker Defender
   2      0        2        Defender wins both
   1      0        1        Defender wins the only roll
   0      1        1        Attacker wins first, defender wins second
  -1      1        0        Attacker wins the only roll
  -2      2        0        Attacker wins both rolls

「プログラムまたは関数は、5つの出力候補のそれぞれに対して一意の識別子を出力する必要があります。」あなたには[1,1]の2つの出力があります。答えを編集してこれを修正してください(並べ替えまたは合計)
-fireflame241

6の何が問題になっていますか?より具体的です。:) 6バイトのコストで変更しました。
Xcali


0

R、46バイト

function(x,y)s(s(y,T)[1:2]>s(x,T)[1:2])
s=sort

オンラインでお試しください!

これは、3回の並べ替えと1回の比較に加えて、中央の最初の2つの要素を抽出するだけです。

入力は、サイコロの2つのベクトルです。

次のようにエンコードされた出力:

╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 10TRUE01FALSE20TRUE  TRUE11FALSE TRUE02FALSE FALSE
╚═══╩═══╝

Rでの抽出は引数をリサイクルせず、結果NAをパディングして要求された長さになるため、機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.