Skor game Load, Defend dan Shoot


11

Ketika saya masih kecil, saya sering bermain game ini.

Aturan

Ada dua pemain (sebut saja mereka A dan B), dan masing-masing pemain menggunakan tangannya sebagai senjata. Ada tiga langkah yang mungkin:

  1. Angkat tangan untuk memuat amunisi ke pistol Anda.

    Setiap senjata mulai kosong. Memuat meningkatkan amunisi per satu.

  2. Tangan menunjuk ke pemain lain untuk menembak.

    Ini mengurangi amunisi satu per satu. Anda harus memiliki setidaknya satu unit amunisi untuk menembak.

  3. Lengan menyilang untuk melindungi diri dari tembakan.

Kedua pemain bergerak secara bersamaan. Jika kedua pemain menembak pada saat yang sama, peluru saling mengenai, dan permainan berlanjut. Permainan berakhir ketika satu pemain menembak sementara yang lainnya memuat amunisi.

Menembak dan pistol kosong dianggap curang . Jika seorang pemain berselingkuh sementara yang lain melakukan tindakan hukum, penipu itu langsung kalah. Jika kedua pemain melakukan cheat secara bersamaan, game akan terus berlanjut.

Upaya curang tidak mengurangi amunisi, sehingga tidak akan pernah menjadi negatif.

Tantangan

Mengingat gerakan yang dilakukan oleh pemain A dan B, output yang pemain memenangkan permainan: 1untuk pemain A, -1untuk pemain B, dan 0untuk hasil imbang. Anda dapat menggunakan tiga nilai pengembalian lainnya, tetapi Anda harus menyatakan jawaban yang mana yang Anda gunakan.

Gim ini dapat:

  • berakhir tanpa harus memproses semua gerakan;
  • tidak berakhir dengan gerakan yang diberikan, dan karenanya dianggap seri.

Input dapat diambil:

  • sebagai string
  • sebagai array / daftar bilangan bulat
  • dengan cara lain yang tidak memproses input

Program atau fungsi penuh diizinkan. Karena ini adalah , jawaban tersingkat dalam byte menang!

Uji kasus

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
Terkait KotH (yang menarik, saya belum pernah memainkan varian game ini; Saya pikir pertanyaan terkait terinspirasi oleh seorang teman yang pernah melakukannya, tetapi sudah lama sekali saya tidak ingat lagi).
Gagang pintu

Jawaban:


6

Jelly, 33 32 24 byte

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

Ini mencetak 5 bukannya -1 , dan 7 bukannya 1 . Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

Coba di sini!

Terima kasih kepada @isaacg untuk menghemat 2 4 byte!

Mengambil input sebagai tuple 2 dengan daftar gerakan pemain A pertama dan gerakan pemain B kedua. Output sama dengan tantangan.

Penjelasan

Tinjauan singkat

  • Pertama-tama kita mengelompokkan gerakan kedua pemain bersama-sama, jadi kami mendapatkan daftar 2-tupel.
  • Kemudian kami memetakan masing-masing tupel ke tupel 2 lainnya dalam bentuk [cheating win, fair win]dengan nilai yang mungkin -1, 0, 1untuk masing-masing tupel , untuk menunjukkan apakah seorang pemain menang pada titik ini ( -1, 1) atau jika permainan berlangsung ( 0)
  • Sekarang kita hanya perlu mendapatkan tuple pertama yang bukan [0,0], dan mengambil elemen non-nol pertama yang menunjukkan pemenang

Rincian kode

.xhfT | Me, -FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b, NYCQ) 0 # Q = daftar daftar pindah

                                      .b, NYCQ # memasangkan elemen dari kedua daftar input
       .e # memetakan daftar pasangan dengan 
                                                 # b adalah pasangan dan k adalah indeksnya
            m Q # memetakan setiap daftar bergerak d
               .b 2S2 # map di atas [1,2], saya tidak bisa menggunakan m karena ini
                                                 # lambda variabel konflik dengan variabel dari .e
                  <dhk # d [: k + 1]
                 / Y # hitung kejadian 1 atau 2 dalam daftar ini
          -F # (hitungan 1s) - (hitungan 2s), menunjukkan kecurangan menang
                           ?} b_BS2 # jika b adalah (1,2) atau (2,1)
                                  -Fb # ambil perbedaannya, menandakan kemenangan yang adil
                                     Z # selain 0, belum ada pemenang
         , # pasangkan 2 nilai tersebut
     | M # Untuk setiap pasangan yang dihasilkan, ambil yang pertama jika
                                                 # bukan nol, kalau tidak yang kedua
   fT # memfilter semua nilai nol keluar
.xh # coba ambil nilai pertama yang menunjukkan pemenang
                                             ) 0 # kalau itu tidak mungkin karena daftar ini kosong
                                                 # output nol untuk menunjukkan hasil seri

m|Fdsama dengan |M.
isaacg

@isaacg Terima kasih! Aku selalu lupa bahwa Mtidak splatting juga. Btw: Masalah tentang variabel lambda yang saling bertentangan yang kita bahas dalam obrolan membebani saya beberapa byte di sini: P
Denker

,1 2sama denganS2
isaacg

Saya telah menambahkan testcase lain;)
dihapus

@isaacg Terima kasih lagi! Tidak tahu bagaimana saya melewatkan itu.
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

Penjelasan : Mengambil A dan B sebagai daftar bilangan bulat. Cukup telusuri setiap pasangan gerakan, tambahkan atau kurangi 1 jika diperlukan dan kembali ketika seseorang menipu atau menang. Lakukan hal yang sama dua kali menggunakan yang lain untuk loop, sekali untuk langkah A dan sekali untuk langkah B. Menambahkan 1 jika x berada di bawah 0 hingga -1.


1

Java, 226 212 200 196 194 byte

-14 bytes dengan memesan ulang logika

-12 byte terima kasih kepada Tuan Umum yang menunjukkan cara menggunakan operasi ternary untuk logika pengambilan gambar

-4 byte dengan menjejalkan logika muatan menjadi satu hubungan arus pendek jika

-2 byte karena ==1=== <2ketika input hanya dapat 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;}

Versi penggunaan dan lekukan:

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

Implementasi game tidak begitu mudah, tetapi sederhana. Setiap siklus, apakah operasi ini:

  • Muat pemindahan ke variabel temp
  • Jika pemain menembak
    • tanpa amunisi: kecurangan bias rterhadap kekalahan
    • dengan amunisi: pengurangan amunisi
  • Jika cheate rtidak 0, kembali nilai karena seseorang ditipu
  • Jika pemain memuat ulang
    • amunisi kenaikan
    • jika pemain lain menembak, kembalikan rugi

x adalah variabel dummy yang digunakan untuk membuat kompiler, biarkan saya menggunakan ekspresi ternary.

Tunggu, Java lebih pendek dari Python?


Saya telah menambahkan testcase lain;)
dihapus

1
@WashingtonGuedes Dan saya bekerja pada kasus ini berkat pengurutan logikanya!
CAD97

Bisakah ifs dibuat menjadi ternarys? misw==2&&m<1?r--:m++
Downgoat

@Downgoat yang lain sesuai dengan bagian dalam jika begitu Anda telah menulisnya, tersier tidak akan berfungsi. Namun, saya mungkin bisa melakukannya dengan batin. Saya akan mengujinya ketika saya mendapat kesempatan.
CAD97

1
@ CAD97 @Downgoat Anda sebenarnya dapat menggunakan operator ternary untuk pernyataan-if. Untuk ternary pertama, int x=w==2?m<1?r--:r:m--;maka terus gunakan x (karena ini hanya variabel dummy untuk membuat ternary beroperasi) sepertix=v==2?n<1?r++:r:n--;
Mr Public
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.