로드, 방어 및 쏴 게임 득점


11

내가 어렸을 때, 나는이 게임을 많이했었다.

규칙

두 명의 플레이어가 있으며 (A와 B라고합시다) 각 플레이어는 손을 총으로 사용합니다. 세 가지 가능한 이동이 있습니다.

  1. 총에 탄약을 실어 올리십시오.

    각 총은 비워집니다. 적재하면 탄약이 1 씩 증가합니다.

  2. 다른 플레이어를 가리키는 손.

    이것은 탄약을 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 (흥미롭게도, 나는이 게임의 변형을 한 적이 없었습니다. 관련 질문은 친구를 가진 친구로부터 영감을 얻은 것으로 생각되지만 더 이상 기억이 나지 않을 정도로 오래되었습니다).
Doorknob

답변:


6

젤리, 33 32 24 바이트

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

이것은 인쇄 5 대신 -17 대신 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에게 감사 합니다!

먼저 플레이어 A의 움직임 목록과 플레이어 B의 움직임 목록을 사용하여 2 튜플로 입력을받습니다. 출력은 도전과 동일합니다.

설명

간단한 개요

  • 먼저 두 플레이어의 움직임을 그룹화하여 2- 튜플 목록을 얻습니다.
  • 그런 다음 각 튜플을 [cheating win, fair win]가능한 한 값 -1, 0, 1을 가진 형태로 다른 2 튜플에 매핑 하여 플레이어가이 시점에서 이겼 -1, 1는지 ( ) 또는 게임이 계속되는지 ( 0)
  • 이제 우리는 아닌 첫 번째 튜플을 [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이기 때문에 사용할 수 없습니다
                                                 # lambda 변수가 .e의 변수와 충돌
                  <dhk # d [: k + 1]
                 이 목록에서 1 또는 2의 / Y # 카운트 발생
          -F # (1의 카운트)-(2의 카운트), 부정 행위의 승리를 나타냅니다
                           ?} b_BS2 # b가 (1,2) 또는 (2,1) 인 경우
                                  -Fb #은 차이를 가져와 공정한 승리를 나타냅니다
                                     Z # else 0, 아직 승자가 없음
         , # 두 값을 쌍으로 묶습니다.
     | M # 각 결과 쌍에 대해 첫 번째 쌍을 취하는 경우
                                                 # 0이 아닌 경우, 그렇지 않은 경우 두 번째
   fT # 모든 0 값을 필터링
.xh # 승자를 나타내는 첫 번째 값을 가져 오십시오.
                                             ) 0 # 목록이 비어있어 불가능한 경우
                                                 # 무승부를 나타내는 출력 0

m|Fd와 동일합니다 |M.
isaacg

@isaacg 감사합니다! 나는 항상 그것이 M튀는 것을 잊어 버립니다 . Btw : 채팅에서 논의한 람다 변수 충돌에 대한 문제는 여기에서 몇 바이트의 비용이
듭니다

,1 2인 동일S2
isaacg

나는 또 다른 테스트 케이스를 추가했다;)
제거

@isaacg 다시 한번 감사드립니다! 내가 어떻게 그리웠는지 모르겠다.
Denker

1

파이썬, 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 루프를 사용하여 한 번, A의 움직임과 B의 움직임에 대해 한 번 사용합니다. x가 0에서 -1로 떨어지면 1을 더합니다.


1

자바 226 212 200 196 194 바이트

논리를 재정렬하여 -14 바이트

촬영 로직에 삼항 연산을 사용하는 방법을 지적한 Mr Public 덕분에 -12 바이트

로드 로직을 하나의 단락 회로로 구성하여 -4 바이트

-2 바이트 때문에 ==1=== <2입력 할 수있는 경우에만 1, 2,3

(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를 삼항으로 만들 수 있습니까? 예 :w==2&&m<1?r--:m++
Downgoat

@ Downgoat 당신이 그것을 쓰면 3 차가 작동하지 않으면 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.