Điểm một trò chơi Tải, Bảo vệ và Bắn


11

Khi còn nhỏ, tôi thường chơi game này rất nhiều.

Quy tắc

Có hai người chơi (hãy gọi họ là A và B) và mỗi người chơi dùng tay làm súng. Có ba động thái có thể:

  1. Giơ tay để nạp đạn vào súng của bạn.

    Mỗi khẩu súng bắt đầu trống rỗng. Nạp đạn làm tăng đạn dược thêm một.

  2. Tay chỉ vào người chơi khác để bắn.

    Điều này làm giảm đạn dược một. Bạn phải có ít nhất một đơn vị đạn để bắn.

  3. Khoanh tay để bảo vệ bản thân khỏi một phát súng.

Cả hai người chơi di chuyển cùng một lúc. Nếu cả hai người chơi bắn cùng một lúc, những viên đạn sẽ bắn vào nhau, và trò chơi tiếp tục. Trò chơi kết thúc khi một người chơi bắn trong khi người kia đang nạp đạn.

Bắn và súng trống được coi là gian lận . Nếu người chơi gian lận trong khi người kia thực hiện hành động pháp lý, người gian lận sẽ mất ngay lập tức. Nếu cả hai người chơi gian lận cùng một lúc, trò chơi tiếp tục.

Nỗ lực gian lận không làm giảm đạn dược, vì vậy nó không bao giờ có thể là tiêu cực.

Thử thách

Đưa ra các động tác được thực hiện bởi người chơi A và B, đầu ra mà người chơi đã thắng trò chơi: 1cho người chơi A, -1cho người chơi B và 0cho một trận hòa. Bạn có thể sử dụng bất kỳ bộ ba giá trị trả về nào khác, nhưng bạn cần nêu trong câu trả lời của mình.

Trò chơi có thể:

  • kết thúc mà không phải xử lý tất cả các động thái;
  • không kết thúc với các động thái nhất định, và do đó nó được coi là một trận hòa.

Đầu vào có thể được thực hiện:

  • như chuỗi
  • dưới dạng mảng / danh sách các số nguyên
  • theo bất kỳ cách nào khác mà không xử lý trước đầu vào

Chương trình đầy đủ hoặc chức năng được phép. Vì đây là , câu trả lời ngắn nhất bằng byte sẽ thắng!

Các trường hợp thử nghiệm

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 liên quan (thật thú vị, tôi chưa bao giờ chơi biến thể của trò chơi này; tôi nghĩ rằng câu hỏi được liên kết được lấy cảm hứng từ một người bạn đã có, nhưng nó đã đủ lâu rồi mà tôi không còn nhớ nữa).
Doorknob

Câu trả lời:


6

Thạch, 33 32 24 byte

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

Điều này in 5 thay vì -17 thay vì 1 . Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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 byte

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

Hãy thử nó ở đây!

Cảm ơn @isaacg đã lưu 2 4 byte!

Có đầu vào là 2 tuple với danh sách các bước di chuyển của người chơi A trước và các bước di chuyển của người chơi B thứ hai. Đầu ra giống như trong thử thách.

Giải trình

Tổng quan ngắn

  • Đầu tiên chúng tôi nhóm các nước đi của cả hai người chơi với nhau, vì vậy chúng tôi nhận được một danh sách gồm 2 bộ.
  • Sau đó, chúng tôi ánh xạ từng bộ dữ liệu đó sang 2 bộ dữ liệu khác trong biểu mẫu [cheating win, fair win]với các giá trị có thể có -1, 0, 1cho mỗi bộ, để cho biết liệu người chơi có chiến thắng tại thời điểm này ( -1, 1) hoặc nếu trò chơi tiếp tục ( 0)
  • Bây giờ chúng ta chỉ cần lấy bộ dữ liệu đầu tiên không có [0,0], và lấy phần tử khác không đầu tiên của nó cho biết người chiến thắng

Sự cố mã

.xhfT | Me, -FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b, NYCQ) 0 # Q = danh sách các danh sách di chuyển

                                      .b, NYCQ # ghép các thành phần của cả hai danh sách đầu vào
       .e # ánh xạ qua danh sách các cặp với 
                                                 # b là cặp và k là chỉ số
            m Q # ánh xạ mỗi danh sách di chuyển d
               .b 2S2 # map trên [1,2], tôi không thể sử dụng m vì nó
                                                 # lambda biến xung đột với một từ .e
                  <dhk # d [: k + 1]
                 / Y # số lần xuất hiện của 1 hoặc 2 trong danh sách này
          -F # (đếm 1 giây) - (đếm 2 giây), biểu thị chiến thắng gian lận
                           ?} b_BS2 # nếu b là (1,2) hoặc (2.1)
                                  -Fb # lấy sự khác biệt, biểu thị chiến thắng công bằng
                                     Z # khác 0, chưa có người chiến thắng
         , # ghép 2 giá trị đó
     | M # Đối với mỗi cặp kết quả, hãy lấy cái đầu tiên nếu
                                                 # nó không bằng không, nếu không thì cái thứ hai
   fT # lọc tất cả các giá trị 0
.xh # thử lấy giá trị đầu tiên cho biết người chiến thắng
                                             ) 0 # nếu điều đó là không thể vì danh sách trống
                                                 # đầu ra bằng 0 để biểu thị một trận hòa

m|Fdcũng giống như |M.
isaacg

@isaacg Cảm ơn! Tôi luôn luôn quên rằng Mkhông bắn tung tóe là tốt. Btw: Vấn đề về các biến lambda xung đột mà chúng tôi đã thảo luận trong trò chuyện đang khiến tôi mất vài byte ở đây: P
Denker

,1 2giống nhưS2
isaacg

Tôi đã thêm một bản thử nghiệm khác;)
đã xóa

@isaacg Cảm ơn một lần nữa! Không biết làm thế nào tôi bỏ lỡ điều đó.
Denker

1

Python, 217 byte

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

Giải thích : Lấy A và B làm danh sách các số nguyên. Đơn giản chỉ cần đi qua từng cặp di chuyển, thêm hoặc trừ 1 nếu cần và quay lại khi ai đó gian lận hoặc chiến thắng. Có phải điều tương tự hai lần sử dụng vòng lặp khác cho vòng lặp, một lần cho di chuyển của A và một lần cho di chuyển của B. Thêm 1 nếu x xuống dưới 0 đến -1.


1

Java, 226 212 200 196 194 byte

-14 byte bằng cách sắp xếp lại logic

-12 byte nhờ Mr Public chỉ ra cách sử dụng thao tác tạm thời cho logic chụp

-4 byte bằng cách nhồi nhét logic tải vào một mạch ngắn nếu

-2 byte vì ==1=== <2khi đầu vào chỉ có thể là 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;}

Phiên bản sử dụng và thụt lề:

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}));
}

Không đơn giản để thực hiện các quy tắc trò chơi nữa, nhưng đơn giản. Mỗi chu kỳ, thực hiện các hoạt động này:

  • Tải di chuyển vào các biến tạm thời
  • Nếu người chơi bắn
    • không có đạn: thiên vị gian lận rđối với mất
    • với đạn: giảm đạn
  • Nếu gian lận rlà không 0, trả lại giá trị vì ai đó đã lừa dối
  • Nếu người chơi tải lại
    • đạn tăng
    • nếu người chơi khác bắn, thua lỗ

x là một biến giả được sử dụng để làm cho trình biên dịch cho phép tôi sử dụng một biểu thức ternary.

Đợi đã, Java là SHORTER hơn Python?


Tôi đã thêm một bản thử nghiệm khác;)
đã xóa

1
@WashingtonGuedes Và tôi làm việc trong trường hợp này nhờ sự sắp xếp lại logic của tôi!
CAD97

Các if có thể được thực hiện thành chim nhạn? ví dụw==2&&m<1?r--:m++
Downgoat

@Downgoat người khác đi với bên trong nếu như bạn đã viết nó thì đại học sẽ không hoạt động. Tuy nhiên, tôi có thể làm như vậy với bên trong nếu. Tôi sẽ kiểm tra nó khi tôi có cơ hội.
CAD97

1
@ CAD97 @Downgoat Bạn thực sự có thể sử dụng các toán tử ternary cho các câu lệnh if. Đối với ternary đầu tiên, int x=w==2?m<1?r--:r:m--;sau đó tiếp tục sử dụng x (vì đây chỉ là một biến giả để làm cho ternary hoạt động) như thếx=v==2?n<1?r++:r:n--;
Mr Public
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.