Оцініть гру Load, Defend і Shoot


11

У дитинстві я багато грав у цю гру.

Правила

Є два гравці (назвемо їх А і В), і кожен гравець використовує руки як гармати. Можливі три кроки:

  1. Руки до завантаження боєприпасів до гармати.

    Кожен пістолет починається порожнім. Завантаження збільшує боєприпаси на одиницю.

  2. Руки, що вказують на іншого гравця, щоб стріляти.

    Це зменшує боєприпаси на одиницю. Для стрільби у вас повинен бути принаймні одна одиниця патронів.

  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 (що цікаво, я ніколи не грав цей варіант гри; я думаю, що пов'язане питання надихнуло друга, який мав, але це було досить давно, я вже не пам'ятаю).
Дверна ручка

Відповіді:


6

Желе, 33 32 24 байт

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

Це друкує 5 замість -1 , 7 замість 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

Спробуйте тут!

Дякуємо @isaacg за збереження 2 4 байти!

Приймає вхід у вигляді двох кортежів із переліком ходів гравця A першого та кроками гравця B секунди. Вихід такий самий, як і у виклику.

Пояснення

Короткий огляд

  • Спочатку ми групуємо рухи обох гравців разом, тому отримуємо список з 2-х кортежів.
  • Тоді ми мапимо кожен з цих кортежів на інший 2-х кортеж у формі [cheating win, fair win]з можливими значеннями -1, 0, 1для кожного з них, щоб вказати, чи виграв гравець у цьому пункті ( -1, 1) чи гра продовжується ( 0)
  • Тепер нам просто потрібно отримати перший кортеж, якого немає [0,0], і взяти перший ненульовий елемент, який вказує на переможця

Розбивка коду

.xhfT | Ме, -FmgF.b / <dhkY2S2Q?} b_BS2-FbZ.b, NYCQ) 0 # Q = список списків переміщення

                                      .b, NYCQ # пара елементів обох списків введення
       .e # карта над списком пар з 
                                                 # b - пара і k - це індекс
            m Q # карта кожного переліку переміщення d
               .b 2S2 # map over [1,2], я не можу використовувати m, оскільки це
                                                 # лямбда-змінна конфліктує із параметром .e
                  <dhk # d [: k + 1]
                 / Y # кількість випадків 1 або 2 у цьому списку
          -F # (count 1s) - (count 2s), вказує на виграш
                           ?} b_BS2 #, якщо b дорівнює (1,2) або (2,1)
                                  -Fb # прийміть різницю, вказує на справедливу виграш
                                     Z # else 0, переможця ще немає
         , # пара цих 2 значень
     | M # Для кожної пари, що виходить, візьміть першу, якщо
                                                 # його не нуль, інакше другий
   fT # відфільтруйте всі нульові значення
.xh # спробуйте взяти перше значення, яке вказує на переможця
                                             ) 0 # якщо це неможливо, оскільки список порожній
                                                 # вихідний нуль, щоб вказати нічию

m|Fdте саме, що |M.
isaacg

@isaacg Дякую! Я завжди забуваю, що так Mсамо бризки. Btw: Питання про суперечливі лямбда-змінні, про які ми обговорювали в чаті, коштує мені кількох байтів тут: P
Denker

,1 2те саме, щоS2
isaacg

Я додав ще один тест;)
видалено

@isaacg Ще раз дякую! Не знаю, як я це пропустив.
Денкер

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, якщо потрібно, і повертається, коли хтось обманює або перемагає. Те саме робить двічі, використовуючи інший для циклу, один раз для переміщення A і один раз для переміщення B. Додає 1, якщо х іде нижче 0 до -1.


1

Ява, 226 212 200 196 194 байт

-14 байт шляхом переупорядкування логіки

-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 - фіктивна змінна, яка використовується для компілятора, дозвольте мені використовувати потрійний вираз.

Зачекайте, Java ШОШЕ, ніж Python?


Я додав ще один тест;)
видалено

1
@WashingtonGuedes І моя робота працює над цим випадком завдяки моєму логічному переупорядкуванню!
CAD97

Чи можна перетворити на тернари? наприкладw==2&&m<1?r--:m++
Пуховик

@Downgoat інше йде з внутрішнім, якщо так, як ви це написали, третинний не буде працювати. Однак я, мабуть, можу це зробити із внутрішнім, якщо. Я перевірю це, коли отримаю можливість.
CAD97

1
@ CAD97 @Downgoat Ви можете фактично використовувати потрійні оператори для операторів if. Для першого терміналу int x=w==2?m<1?r--:r:m--;продовжуйте використовувати x (оскільки це лише фіктивна змінна, щоб змусити працювати тернар) на кшталтx=v==2?n<1?r++:r:n--;
Пан Громадський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.