ロード、ディフェンド、シュートのゲームを獲得する


11

私は子供の頃、このゲームをよくプレイしていました。

ルール

2人のプレイヤーがいて(AとBと呼びましょう)、各プレイヤーは銃として手を使います。3つの可能な動きがあります。

  1. あなたの銃に弾薬をロードするために手を挙げてください。

    各銃は空から始まります。装填により弾薬が1つ増えます。

  2. 撮影する他のプレイヤーを指している手。

    これにより、弾薬が1つ減少します。射撃するには、少なくとも1ユニットの弾薬が必要です。

  3. 腕を組んで、ショットから身を守ります。

両方のプレイヤーが同時に移動します。両方のプレイヤーが同時に撃つ場合、弾丸は互いに衝突し、ゲームは続行します。片方のプレイヤーが弾薬を装填している間に他のプレイヤーが撃つと、ゲームは終了します。

銃撃と空の銃は不正行為と見なされます。プレーヤーが不正行為を行っている間に他のプレーヤーが不正行為を行った場合、不正行為者はすぐに負けます。両方のプレイヤーが同時にチートした場合、ゲームは続行します。

不正行為は弾薬を減少させないので、決してマイナスになることはありません。

チャレンジ

プレーヤーAとBの動きを考慮して、どのプレーヤーがゲームに勝ったかを出力します:1プレーヤーA、-1プレーヤーB、0引き分け。戻り値のその他のトリプルを使用できますが、使用するものを回答に記載する必要があります。

ゲームは:

  • すべての動きを処理することなく終了します。
  • 与えられた動きで終わらないため、引き分けと見なされます。

入力を取得できます。

  • 文字列として
  • 整数の配列/リストとして
  • 入力を前処理しない他の方法で

完全なプログラムまたは機能が許可されます。これはなので、バイト単位の最短回答が勝ちです!

テストケース

A: "123331123"
B: "131122332"
    -----^                Player B shoots player A and wins.

Output: -1
A: "111322213312"
B: "131332221133"
    -------^              Player B cheats and loses.

Output: 1
A: "1333211232221"
B: "1213211322221"
    ----------^^          Both players cheat at the same time. The game continues.

Output: 0
A: "12333213112222212"
B: "13122213312232211"
         |       || ^---- Player A shoots player B and wins.
         ^-------^^------ Both players cheat at the same time. The game continues.

Output: 1

1
関連するKotH(興味深いことに、このゲームのバリエーションをプレイしたことはありません。リンクされた質問は、持っていた友人からインスピレーションを受けたと思いますが、もう覚えていないのはかなり前のことです)。
ドアノブ

回答:


6

ゼリー、33 32 24バイト

Zæ%1.»0$+¥\>-‘żZḅ3Ff5,7Ḣ

これは、印刷5の代わりに-1、及び7の代わりに、1オンラインでお試しください!または、すべてのテストケースを確認します

使い方

Zæ%1.»0$+¥\>-‘żZḅ3Ff5,7Ḣ  Main link. Argument: A (digit list array)

Z                         Zip; group corresponding digits.
 æ%1.                     Map the digits in (-1.5, 1.5].
                          This replaces [1, 2, 3] with [1, -1, 0].
          \               Cumulatively reduce the pairs by doing the following.
     »0$                    Take the maximum of the left value and 0, i.e., replace
                            a -1 with a 0.
        +¥                  Add the modified left value to the right value.
                          This computes the available ammo after each action. An
                          ammo of -1 indicates a cheating attempt.
           >-             Compare the results with -1.
             ‘            Increment. And unilateral cheating attempt is now [1, 2]
                          or [2, 1], where 1 signals the cheater and 2 the winner.
              żZ          Pair each result with the corr., original digits.
                ḅ3        Convert each pair from base 3 to integer.
                          This maps [1, 2] and [2, 1] to 5 and 7.
                  F       Flatten the resulting, nested list.
                   f5,7   Discard all but 5's and 7's.
                       Ḣ  Grab the first element (5 or 7).
                          If the list is empty, this returns 0.

2

Pyth、48 46 49 47バイト

.xhfT|M.e,-FmgF.b/<dhkY2S2Q?}b_BS2-FbZ.b,NYCQ)0

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

2 4バイトを節約してくれた@isaacgに感謝します!

入力を2タプルとして、最初にプレーヤーAの動きのリスト、次にプレーヤーBの動きのリストを受け取ります。出力はチャレンジの場合と同じです。

説明

簡単な概要

  • まず、両方のプレイヤーの動きをグループ化し、2タプルのリストを取得します。
  • 次に、これらの各タプルを、それぞれの[cheating win, fair win]可能な値-1, 0, 1を持つフォーム内の別の2タプルにマッピングし、この時点でプレーヤーが勝った-1, 1か()、ゲームが続行するか(0)を示します
  • ではない最初のタプルを取得し[0,0]、勝者を示す最初の非ゼロ要素を取得するだけです

コードの内訳

.xhfT | Me、-FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b、NYCQ)0#Q =移動リストのリスト

                                      .b、NYCQ#両方の入力リストの要素をペアにします
       .e#ペアのリストにマップする 
                                                 #bがペアで、kがインデックス
            m Q#各移動リストをマップするd
               .b 2S2#[1,2]にマップ、mを使用できない
                                                 #ラムダ変数が.eの変数と競合しています
                  <dhk#d [:k + 1]
                 / Y#このリストの1または2の出現をカウント
          -F#(1のカウント)-(2のカウント)、不正行為の勝利を示します
                           ?} b_BS2#bが(1,2)または(2,1)の場合
                                  -Fb#差を取る、公正な勝利を示す
                                     Z#else 0、まだ勝者なし
         、#これら2つの値をペアリング
     | M#結果のペアごとに、最初のペアを取得します
                                                 #ゼロではない、そうでなければ2番目
   fT#すべてのゼロ値を除外する
.xh#勝者を示す最初の値を取得しよう
                                             )0#リストが空のためそれが不可能な場合
                                                 #ゼロを出力して引き分けを示す

m|Fdはと同じ|Mです。
isaacg

@isaacgありがとう!スMプラッティングも同様に忘れます。Btw:チャットで説明した競合するラムダ変数に関する問題により、ここで数バイトのコストがかかります
。P– Denker

,1 2同じであるS2
isaacg

別のテストケースを追加しました;)
削除

@isaacg再びありがとう!私がそれを見逃した方法がわからない。
デンカー

1

Python、217バイト

def f(A,B):
 x=y=0;c=[-1,1,0]
 for i in range(len(A)):
  a=A[i];b=B[i]
  for s in[0,1]:
   if(a,b)==(2,1):return c[s]*c[x<1]
   if(a,b)==(2,3)and x<1:return-c[s]
   x-=c[a-1];x+=x<0;a,b,x,y=b,a,y,x
 return 0

説明:AおよびBを整数のリストとして使用します。動きの各ペアを通過し、必要に応じて1を加算または減算し、誰かがチートまたは勝ったときに戻ります。別のforループを使用して、同じことを2回行います。1回はAの移動、もう1回はBの移動です。xが0未満から-1になると1を追加します。


1

Javaの、226の 212 200 196 194バイト

並べ替えロジックによる-14バイト

撮影ロジックに3項演算を使用する方法を指摘しているパブリック氏のおかげで-12バイト

-4バイトの場合、ロードロジックを1つの短絡回路に詰め込みます。

ため-2バイト==1=== <2入力のみとすることができる場合に123

(a,b)->{for(int m=0,n=0,w,v,r=0,i=0,x;i<a.length;){w=a[i];v=b[i++];x=w==2?m<1?r--:m--:0;x=v==2?n<1?r++:n--:0;if(r!=0)return r;if(w<2&&++m>0&v==2)return -1;if(v<2&&++n>0&w==2)return 1;}return 0;}

使用法とインデントされたバージョン:

static BiFunction<Integer[], Integer[], Integer> game = (a,b) -> {
    for(int m=0,n=0,w,v,r=0,i=0,x;i<a.length;) {
        w=a[i];v=b[i++];
        // shoot
        x=w==2?m<1?r--:m--:0;
        x=v==2?n<1?r++:n--:0;
        if(r!=0)return r;
        // load
        if(w<2&&++m>0&v==2)return -1;
        if(v<2&&++n>0&w==2)return 1;
    }
    return 0;
};

public static void main(String[] args) {
    System.out.println(game.apply(new Integer[] {1,2,3,3,3,1,1,2,3}, new Integer[] {1,3,1,1,2,2,3,3,2}));
    System.out.println(game.apply(new Integer[] {1,1,1,3,2,2,2,1,3,3,1,2}, new Integer[] {1,3,1,3,3,2,2,2,1,1,3,3}));
    System.out.println(game.apply(new Integer[] {1,3,3,3,2,1,1,2,3,2,2,2,1}, new Integer[] {1,2,1,3,2,1,1,3,2,2,2,2,1}));
}

ゲームルールのそれほど単純な実装ではなく、単純です。各サイクルでは、次の操作を実行します。

  • ロードが一時変数に移動します
  • プレーヤーが撃った場合
    • 弾薬なし:r負けへの偏見のチート
    • 弾薬あり:弾薬を減らす
  • チートrがそうでない0場合、誰かがチートしたので値を返す
  • プレイヤーがリロードした場合
    • 弾薬を増やす
    • 他のプレイヤーが撃った場合、リターンロス

x コンパイラーに3項式を使用させるダミー変数です。

待ってください、JavaはPythonよりも短いのですか?


別のテストケースを追加しました;)
削除

1
@WashingtonGuedesそして、私の場合は私のロジックの再配列のおかげでこのケースで動作します!
CAD97

ifsを3進数にできますか?例w==2&&m<1?r--:m++
Downgoat

@Downgoat elseは、あなたが書いたようにターシャリーが機能しない場合、インナーと一緒に行きます。しかし、私はおそらく内部のifでそうすることができます。機会があればテストします。
CAD97

1
@ CAD97 @Downgoat if文には実際に三項演算子を使用できます。最初の三成分のために、int x=w==2?m<1?r--:r:m--;そして(これは三元を動作させるための単なるダミー変数であるとして)のようなXを使い続けるx=v==2?n<1?r++:r:n--;
ミスター公共
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.