Yük, Savunma ve Vur oyununu puanla


11

Ben çocukken bu oyunu çok oynardım.

kurallar

İki oyuncu var (onlara A ve B diyelim) ve her oyuncu ellerini silah olarak kullanıyor. Üç olası hareket vardır:

  1. Silahınıza mühimmat yüklemek için eller yukarı.

    Her silah boşalmaya başlar. Yükleme mühimmatı bir arttırır.

  2. Ateş diğer oyuncuya işaret eden eller.

    Bu, mühimmatı bir azaltır. Ateş etmek için en az bir birim cephaneniz olmalı.

  3. Kendinizi bir atıştan korumak için çapraz kollar.

Her iki oyuncu aynı anda hareket eder. Her iki oyuncu da aynı anda ateş ederse, mermiler birbirlerine vurur ve oyun devam eder. Oyun, bir oyuncu ateş ederken diğeri mühimmat yüklerken sona erer.

Atış ve boş silah hile olarak kabul edilir . Bir oyuncu hukuki bir işlem yaparken hile yaparsa, dolandırıcı hemen kaybeder. Her iki oyuncu aynı anda hile yaparsa, oyun devam eder.

Hile girişimleri mühimmatı azaltmaz, bu yüzden asla negatif olamaz.

Meydan okuma

A ve B oyuncuları tarafından yapılan hamleler göz önüne alındığında, hangi oyuncunun oyunu kazandığını belirtin: 1A -1oyuncusu için, B oyuncusu 0için ve beraberlik için. Başka herhangi bir dönüş değeri kullanabilirsiniz, ancak cevabınızda hangisini kullandığınızı belirtmeniz gerekir.

Oyun:

  • tüm hareketleri işlemek zorunda kalmadan sona erer;
  • verilen hamleler ile bitmez ve bu nedenle bir beraberlik olarak kabul edilir.

Giriş alınabilir:

  • dize olarak
  • diziler / tamsayılar listesi olarak
  • girişi ön işleme tabi tutmayan başka bir şekilde

Tam program veya işlevlere izin verilir. Bu olduğundan, bayttaki en kısa cevap kazanır!

Test senaryoları

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
İlgili KotH (ilginç bir şekilde, oyunun bu varyantını hiç oynamadım; bağlantılı soruya sahip olan bir arkadaştan ilham aldığını düşünüyorum, ancak artık hatırlamadığım kadar uzun zaman geçti).
Kapı tokmağı

Yanıtlar:


6

Jöle, 33 32 24 bayt

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

Bu baskılar 5 yerine -1 ve 7 yerine 1 . Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

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 bayt

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

Burada deneyin!

2 4 bayt tasarruf için @isaacg'a teşekkürler !

İlk olarak A oyuncunun hamle listesi ve ikinci B oyuncunun hamle listesi ile girişi 2 demet olarak alır. Çıktı meydan okuma ile aynıdır.

açıklama

Kısa genel bakış

  • İlk önce her iki oyuncunun hareketlerini bir araya getiriyoruz, böylece 2 masalı bir liste alıyoruz.
  • Daha sonra, bu tuple'ların her birini, her bir oyuncu için [cheating win, fair win]olası değerlere sahip bir başka 2-tuple ile eşleriz, -1, 0, 1bir oyuncunun bu noktada kazanıp kazanmadığını ( -1, 1) veya oyun devam ederse ( 0)
  • Şimdi sadece olmayan ilk tupu [0,0]almamız ve kazananı gösteren ilk sıfır olmayan elemanını almamız gerekiyor

Kod dökümü

.xhfT | Me, -FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b, NYCQ) 0 # Q = taşıma listelerinin listesi

                                      .b, NYCQ # her iki giriş listesinin öğelerini eşleştirir
       .e # 
                                                 # b çift olmak ve k endeksi
            m Q # her hareket listesini eşle
               .b 2S2 # [1,2] üzerinde harita, m kullanamıyorum çünkü
                                                 # lambda değişkeni .e ile olanla çakışıyor
                  <dhk # d [: k + 1]
                 / Y # bu listedeki 1 veya 2 sayısını gösterir
          -F # (1s sayısı) - (2s sayısı), hile kazancını gösterir
                           ?} b (1,2) veya (2,1) ise b_BS2 #
                                  -Fb # farkı al, adil kazancı gösterir
                                     Z # başka 0, henüz kazanan yok
         , # bu 2 değeri eşleştir
     | M # Her bir sonuç çifti için, ilk önce
                                                 # sıfır değil, aksi takdirde ikincisi
   fT # tüm sıfır değerleri filtrele
.xh # kazananı gösteren ilk değeri almaya çalışın
                                             ) 0 # eğer liste boş olduğu için bu mümkün değilse
                                                 # çıktı sıfır çizmeyi belirtmek için

m|Fdile aynıdır |M.
isaacg

@isaacg Teşekkürler! Bunun Msıçramasını da her zaman unutuyorum . Btw: Sohbette tartıştığımız çelişkili lambda değişkenleriyle ilgili konu bana burada birkaç bayta mal oluyor: P
Denker

,1 2ile aynıdırS2
isaacg

Başka bir test çantası ekledim;)
kaldırıldı

@isaacg Tekrar teşekkürler! Bunu nasıl özlediğimi bilmiyorum.
Denker

1

Python, 217 bayt

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çıklama : A ve B'yi tamsayılar listesi olarak alır. Her hamle çiftinden geçer, gerekirse 1 ekler veya çıkarır ve birisi hile yaptığında veya kazandığında geri döner. Aynı şeyi iki kez diğeri döngü için, biri A'nın hareketi ve diğeri de B'nin hareketi için kullanır. X 0 ile -1 arasına düşerse 1 ekler.


1

Java, 226 212 200 196 194 bayt

Mantığı yeniden sıralayarak -14 bayt

Bay Public sayesinde çekim mantığı için üçlü bir operasyonun nasıl kullanılacağına dikkat çeken -12 bayt

Yük mantığını bir kısa devreye dönüştürerek -4 bayt

-2 bayt için ==1=== <2girişi sadece olabilir zaman 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;}

Kullanım ve girintili sürüm:

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

Artık oyun kurallarının o kadar basit bir şekilde uygulanması değil, basit. Her döngü şu işlemleri yapar:

  • Geçici değişkenlere yük taşıma
  • Oyuncu vurulursa
    • cephane olmadan: rkaybetme yönünde önyargı
    • cephane ile: cephane azaltmak
  • Cheate rdeğilse 0, birileri aldattığı için değeri döndürün
  • Oynatıcı yeniden yüklendiyse
    • cephane artırmak
    • eğer diğer oyuncu vurulursa, geri dönüş kaybı

x derleyiciyi üçlü ifadeyi kullanmama izin veren kukla bir değişkendir.

Bekle, Java Python'dan KISA mı?


Başka bir test çantası ekledim;)
kaldırıldı

1
@WashingtonGuedes Ve benim mantığım yeniden sıralaması sayesinde bu davada çalışıyor!
CAD

İftiralar ternariye yapılabilir mi? ör.w==2&&m<1?r--:m++
Downgoat

@Downgoat, üçüncü olarak işe yaramazsa, yazdığınız takdirde iç kısımla birlikte gider. Bununla birlikte, muhtemelen iç if ile yapabilirim. Şansım olduğunda test edeceğim.
CAD97

1
@ CAD97 @Downgoat if-ifadeleri için üçlü operatörler kullanabilirsiniz. İlk üçlü int x=w==2?m<1?r--:r:m--;için, x'i kullanmaya devam edin (bu x=v==2?n<1?r++:r:n--;
üçlünün
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.