Битва букв

9

Ваша задача проста: скажите мне, кто победит в битве букв.

Войска

В этой битве есть три разных «войска», которые представлены в этой таблице.

name | health | damage
   A       25       25
   B      100        5
   C       10       50

Вы можете использовать любые три уникальных символа для обозначения войск, но должны указать, не являются ли они этими буквами.

Бой

Предположим, у нас есть образец битвы:

ABC # army 1
CBA # army 2

Каждая армия многократно стреляет в крайнее левое подразделение, пока оно не погибнет; затем они движутся к отряду вправо и повторяются. Итак, армия 2 атакует Aв армии 1, пока Aне умрет, затем перейдите к B, затем C. Армия 1 атакует Cсначала, потом B, потом A. Предположим, что армии атакуют одновременно, и поэтому войска всегда будут стрелять, если они были живы до раунда, и могут убивать друг друга в одно и то же время. Они стреляют в порядке слева направо.

Битва будет выглядеть так:

ABC
CBA

BC # A (25 hp) killed by C (-50 hp), B (100 hp) attacked by B (-5 hp) and A (-25 hp), has 70 hp
BA # C (10 hp) killed by A (-25 hp), B (100 hp) attacked by B (-5 hp) and C (-50 hp), has 45 hp

BC # B (70 hp) attacked by B (-5 hp) and A (-25 hp), has 40 hp
A  # B (45 hp) killed by B (-5 hp) and C (-50 hp)

BC # B (40 hp) attacked by A (-25 hp), has 15 health
   # A (25 hp) killed by B (-5 hp) and C (-50 hp), army 2 dead

Поэтому армия 1 выигрывает битву!

вход

Две строки, первая представляет армию 1, а вторая армию 2. Они не обязательно имеют одинаковый размер (потому что, кто сказал, что это будет честный бой?)

Вывод

Любые три уникальных постоянных значения, представляющих победу армии 1, армии 2 победы или маловероятное событие ничьей. Да, последние войска могут убивать друг друга, заканчивая ничьей.

Сражения

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Применяются стандартные лазейки . Вы должны представить полную программу.

Это кратчайшее решение выигрывает.

Нил А.
источник
"постоянный" почему?
CalculatorFeline
Также Aбьет Bи Cгалстуки, Bи Aгалстуки C. Изменение любого из Aзначений на 20заставит его связать B.
CalculatorFeline
2
Разрешено ли использовать другое входное представление? Скажем, 012 вместо ABC?
Grimmy
@ Грими: Да, я буду редактировать пост.
Нил А.

Ответы:

3

Pyth 145 97 байт

=Y.d[,\A,25 25,\B,*TT5,\C,T*5T)Km=G@YdzJm=H@YdwW&KJMX0hG_smedH gKJ gJKI<hhK0=tK)I<hhJ0=tJ;?K1?J2Z

Чуть менее наивно, чем раньше.

Попробуйте онлайн!

Пояснения:

Разрежем программу на несколько частей.

=Y.d[,\A,25 25,\B,*TT5,\C,T*5T)

     ,\A,25 25                     Create this list: ['A', [25, 25]]
              ,\B,*TT5             Create this list: ['B', [100, 5]]
                      ,\C,T*5T     Create this list: ['C', [10, 50]]
  .d[                         )    From the three lists, create a dictionary whose keys are the letters, and values are the inner lists
=Y                                 Assign to the variable Y

Словарь Yявляется: {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Затем:

Km=G@YdzJm=H@YdwMX0hG_smedH

 m=G@Ydz                           For all letters in first input string, make a copy of Y[letter]. Make a list of all those values...
K                                  ...and assign the list to the variable K
         m=H@Ydw                   For all letters in second input string, make a copy of Y[letter]. Make a list of all those values...
        J                          ...and assign the list to the variable J
                MX0hG_smedH        Create a function g which takes two lists of couples, and subtract the sum of the second elements of the couples of the second list from the first element of the first couple of the first list

На данный момент, Kэто список пар, который представляет первую армию. Каждая пара в этом списке является письмом армии и предназначена (health, damage)для этого письма. Jточно такой же, но для второй армии. gэто функция, которая берет две армии и наносит урон, нанесенный второй армией, первой. Сейчас же:

W&KJ gKJ gJKI<hhK0=tK)I<hhJ0=tJ;

W&KJ                               While K not empty and J not empty
     gKJ                           Call g(K,J). That computes the damages to first army
         gJK                       Call g(J,K). That computes the damages to second army
            I<hhK0=tK)             If the first army's first letter is dead, remove it
                      I<hhJ0=tJ    If the second army's first letter is dead, remove it
                               ;   End of while loop

Когда цикл while закончен, Kи Jего окончательное значение Если они оба пусты, это галстук; в противном случае непустая армия победит. Это обрабатывается последним фрагментом кода:

?K1?J2Z

?K1                                If K non-empty, display 1. Else...
   ?J2                             ...if J non-empty, display 2. Else...
      Z                            ...display zero

Это оно!

Джим
источник
2

Haskell , 199 193 179 176 171 байт

a!b=(t<$>a)?(t<$>b)
t v=[(5,5),(20,1),(2,10)]!!(fromEnum v-65)
m=sum.map snd
f=filter((>0).fst)
[]?[]=0
[]?_=2
_?[]=1
a@((c,d):e)?b@((h,i):j)=f((c-m b,d):e)?f((h-m a,i):j)

Попробуйте онлайн!

Небольшой трюк: разделить все показатели армии на 5.

bartavelle
источник
0

C #, 446 байт

using System.Linq;(c,d)=>{int z=c.Length,v=d.Length,j=0,k=0,l=0,m=0,q=0;int[]e=(c+d).Select(x=>x!='A'?x=='B'?100:10:25).ToArray(),f=e.Skip(z).ToArray();e=e.Take(z).ToArray();int[]g=(c+d).Select(x=>x!='A'?x=='B'?5:100:25).ToArray(),h=g.Skip(z).ToArray();g=g.Take(z).ToArray();try{for(;;){for(q=l;q<z;q++){if(e[j]<=0)j++;e[j]-=h[q];}for(q=k;q<v;q++){if(f[m]<=0)m++;f[m]-=g[q];}if(e[k]<=0)k++;if(f[l]<=0)l++;}}catch{}return k-z>=l-v?k-z>l-v?0:2:1;};

Отформатированная версия:

         (c, d) => {
                int z = c.Length, v = d.Length, j = 0, k = 0, l = 0, m = 0, q = 0;

                int[] e = (c + d).Select(x => x != 'A' ? x == 'B' ? 100 : 10 : 25).ToArray(), f = e.Skip(z).ToArray();
                e = e.Take(z).ToArray();

                int[] g = (c + d).Select(x => x != 'A' ? x == 'B' ? 5 : 100 : 25).ToArray(), h = g.Skip(z).ToArray();
                g = g.Take(z).ToArray();

                try {
                    for (;;) {
                        for (q = l; q < z; q++) {
                            if (e[j] <= 0) j++; e[j] -= h[q];
                        }
                        for (q = k; q < v; q++) {
                            if (f[m] <= 0) m++; f[m] -= g[q];
                        }
                        if (e[k] <= 0) k++; if (f[l] <= 0) l++;
                    }
                }
                catch {
                }

                return k - z >= l - v ? k - z > l - v ? 0 : 2 : 1;
            };

Выводит 1, если армия1 выигрывает, 2 для армии2 и 0 для ничьей

LiefdeWen
источник
Вы можете добавить отформатированную / расширенную версию? 446 байтов много, даже для C # Я уверен, что будут некоторые улучшения.
TheLethalCoder
Для начала у вас есть несколько строк, объявляющих, int[]я думаю, вы можете объединить их, `` <= 0` это то же самое, что и <1наверняка? Вам нужен try-catch?
TheLethalCoder
0

Javascript (ES6) - 316 269 ​​байт

Я уверен, что это может быть игра в гольф, как ад, но это то, что я придумал :) Хотя мне удалось сбрить 47 байтов!

Выходы 0 для ничьей, 1 для команды 1 и 2 для команды 2.

l=(d,f)=>{for(t=[d,f].map(g=>g.split``.map(k=>[[25,100,10],[25,5,50]].map(m=>m[k.charCodeAt()-65])));(w=t.map(g=>g.some(k=>0<k[0])))[0]&&w[1];)t.forEach((g,k,m)=>m[k].sort(o=>0>o[0])[0][0]-=m[+!k].filter(o=>0<o[0]).reduce((o,p)=>o+p[1],0));return w[0]||w[1]?w[0]?1:2:0}

Читаемый :

function ltt(a,b){
    t=[a,b].map(x=>x.split``.map(c=>[[25,100,10],[25,5,50]].map(e=>e[c.charCodeAt()-65])))
    while((w=t.map(_=>_.some(x=>x[0]>0)))[0]&&w[1]){
        t.forEach((y,i,n)=>n[i].sort(j=>j[0]<0)[0][0]-=n[+!i].filter(x=>x[0]>0).reduce((h,v)=>h+v[1],0))
    }
    return(!w[0]&&!w[1])?0:(w[0])?1:2
}

Демо :

l=(d,f)=>{for(t=[d,f].map(g=>g.split``.map(k=>[[25,100,10],[25,5,50]].map(m=>m[k.charCodeAt()-65])));(w=t.map(g=>g.some(k=>0<k[0])))[0]&&w[1];)t.forEach((g,k,m)=>m[k].sort(o=>0>o[0])[0][0]-=m[+!k].filter(o=>0<o[0]).reduce((o,p)=>o+p[1],0));return w[0]||w[1]?w[0]?1:2:0}

var prnt=(g,h)=>{
  n=l(g,h);
  return(n==0)?"Tie!":`Team ${n} wins!`
}

console.log("ABCB - ABC: " + prnt("ABCB","ABC"));
console.log("BAAA - BBC: " + prnt("BAAA","BBC"));
console.log("AAAA - BBC: " + prnt("AAAA","BBC"));
console.log("ABC - BBC: " + prnt("ABC","BBC"));
console.log("ABC - CBA: " + prnt("ABC","CBA"));

Hankrecords
источник
Просто заметил, что текущая версия не может оценить связи, что могла бы сделать 316-байтовая версия. Я посмотрю на это
Hankrecords