Strzel grę Load, Defend and Shoot


11

Jako dziecko często grałem w tę grę.

Zasady

Jest dwóch graczy (nazwijmy je A i B), a każdy gracz używa swoich rąk jako broni. Istnieją trzy możliwe ruchy:

  1. Ręce do góry, aby załadować amunicję do pistoletu.

    Każdy pistolet zaczyna się pusty. Ładowanie zwiększa amunicję o jeden.

  2. Ręce skierowane na drugiego gracza do strzału.

    To zmniejsza amunicję o jeden. Musisz strzelać przynajmniej jedną jednostką amunicji.

  3. Skrzyżowane ramiona, aby uchronić się przed strzałem.

Obaj gracze poruszają się jednocześnie. Jeśli obaj gracze strzelają w tym samym czasie, pociski trafiają się nawzajem, a gra trwa. Gra kończy się, gdy jeden z graczy strzela, a drugi ładuje amunicję.

Strzelanie i pusta broń jest uważane za oszustwo . Jeśli gracz oszukuje, podczas gdy drugi dokonuje czynności prawnej, oszust przegrywa natychmiast. Jeśli obaj gracze oszukują w tym samym czasie, gra jest kontynuowana.

Próby oszukiwania nie zmniejszają amunicji, więc nigdy nie mogą być negatywne.

Wyzwanie

Biorąc pod uwagę ruchy wykonane przez graczy A i B, dane wyjściowe, który gracz wygrał grę: 1dla gracza A, -1dla gracza B i 0remisu. Możesz użyć dowolnej potrójnej wartości zwrotnej, ale musisz w odpowiedzi określić, których używasz.

Gra może:

  • zakończyć bez konieczności przetwarzania wszystkich ruchów;
  • nie kończą się podanymi ruchami i dlatego uważa się je za remis.

Dane wejściowe można podjąć:

  • jak struny
  • jako tablice / listy liczb całkowitych
  • w jakikolwiek inny sposób, który nie przetwarza danych wejściowych

Pełny program lub funkcje są dozwolone. Ponieważ jest to , wygrywa najkrótsza odpowiedź w bajtach!

Przypadki testowe

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
Powiązany KotH (co ciekawe, nigdy nie grałem w ten wariant gry; myślę, że powiązane pytanie zostało zainspirowane przez znajomego, który miał, ale to było wystarczająco dawno temu, że już nie pamiętam).
Klamka

Odpowiedzi:


6

Galaretka, 33 32 24 bajtów

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

Drukuje 5 zamiast -1 i 7 zamiast 1 . Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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 bajtów

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

Wypróbuj tutaj!

Dzięki @isaacg za zapisanie 2 4 bajtów!

Pobiera dane wejściowe jako 2-krotkę z listą ruchów gracza A jako pierwszy i ruchów gracza B. jako drugim. Wydajność jest taka sama jak w wyzwaniu.

Wyjaśnienie

Krótki przegląd

  • Najpierw grupujemy ruchy obu graczy razem, więc otrzymujemy listę 2-krotek.
  • Następnie mapujemy każdą z tych krotek na inną 2-krotkę w formie [cheating win, fair win]z możliwymi wartościami -1, 0, 1dla każdej z nich, aby wskazać, czy gracz wygrał w tym momencie ( -1, 1) lub czy gra toczy się dalej ( 0)
  • Teraz musimy tylko zdobyć pierwszą krotkę, która nie jest [0,0], i wziąć jej pierwszy niezerowy element wskazujący zwycięzcę

Podział kodu

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

                                      .b, NYCQ # paruje elementy obu list wejściowych
       .e # map na liście par z 
                                                 # b jest parą, a k to indeks
            m Q # mapuj każdą listę ruchów d
               .b 2S2 # mapa ponad [1,2], nie mogę użyć m, ponieważ to jest
                                                 # zmienna lambda jest w konflikcie z zmienną z .e
                  <dhk # d [: k + 1]
                 / Y # zlicza wystąpienia 1 lub 2 na tej liście
          -F # (liczba 1s) - (liczba 2s), oznacza zwycięstwo w oszustwie
                           ?} b_BS2 # jeśli b to (1,2) lub (2,1)
                                  -Fb # weź różnicę, oznacza uczciwą wygraną
                                     Z # else 0, jeszcze nie ma zwycięzcy
         , # sparuj te 2 wartości
     | M # Dla każdej wynikowej pary weź pierwszą, jeśli
                                                 # nie jest zero, w przeciwnym razie drugi
   fT # odfiltrowuje wszystkie wartości zerowe
.xh # spróbuj przyjąć pierwszą wartość wskazującą zwycięzcę
                                             ) 0 # jeśli nie jest to możliwe, ponieważ lista jest pusta
                                                 # wyjście zero, aby wskazać remis

m|Fdjest taki sam jak |M.
isaacg

@isaacg Thanks! Zawsze o tym zapominam M. Btw: Problem sprzecznych zmiennych lambda, o którym rozmawialiśmy na czacie, kosztuje mnie tutaj kilka bajtów: P
Denker

,1 2jest taki sam jakS2
isaacg

Dodałem kolejną próbę;)
usunąłem

@isaacg Jeszcze raz dziękuję! Nie wiem jak mi tego brakowało.
Denker

1

Python, 217 bajtów

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

Objaśnienie : Pobiera A i B jako listy liczb całkowitych. Po prostu przechodzi przez każdą parę ruchów, dodaje lub odejmuje 1 w razie potrzeby i zwraca, gdy ktoś zdradzi lub wygra. Robi to samo dwa razy, używając innej pętli for, raz dla ruchu A i raz dla ruchu B. Dodaje 1, jeśli x spadnie poniżej 0 do -1.


1

Java, 226 212 200 196 194 bajtów

-14 bajtów poprzez zmianę kolejności logiki

-12 bajtów dzięki Panu Publicowi wskazującemu, jak wykorzystać trójskładnikową logikę strzelania

-4 bajty poprzez wciśnięcie logiki obciążenia w jedno zwarcie, jeśli

-2 bajty, ponieważ ==1=== <2gdy sygnał wejściowy może być tylko 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;}

Użycie i wersja wcięta:

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

Nie tak prosta implementacja zasad gry, ale prosta. W każdym cyklu wykonuje następujące operacje:

  • Obciążenia przenoszą się na zmienne temp
  • Jeśli gracz strzelił
    • bez amunicji: uprzedzenia oszukiwać w rkierunku przegrania
    • z amunicją: amunicja zmniejszająca się
  • Jeśli cheat rnie jest 0, zwróć wartość, ponieważ ktoś oszukiwał
  • Jeśli gracz przeładował
    • przyrost amunicji
    • jeśli inny gracz strzelił, strata zwrotu

x jest zmienną fikcyjną używaną do tego, aby kompilator pozwolił mi użyć wyrażenia trójskładnikowego.

Zaraz, Java jest SHORTER niż Python?


Dodałem kolejną próbę;)
usunąłem

1
@WashingtonGuedes A moje prace nad tą sprawą dzięki mojej logice!
97 CAD

Czy można przekształcić ifs w ternarys? np.w==2&&m<1?r--:m++
Downgoat

@Downgoat inny idzie z wewnętrznym, jeśli tak, jak napisałeś, trzeciorzędny nie działa. Jednak prawdopodobnie mogę to zrobić z wewnętrznym if. Przetestuję to, kiedy będę miał szansę.
97 CAD

1
@ CAD97 @Downgoat W instrukcji if można używać operatorów trójskładnikowych. W przypadku pierwszej trójki int x=w==2?m<1?r--:r:m--;nadal używaj x (ponieważ jest to tylko zmienna fikcyjna, aby trójka działała) jak:x=v==2?n<1?r++:r:n--;
Public Public
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.