Битва листів


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з значень 's 20, зробить його зв'язаним B.
CalculatorFeline

2
Чи дозволяється нам використовувати інше вхідне подання? Скажіть, 012 замість ABC?
Grimmy

@Grimy: Так, я відредагую публікацію.
Ніл А.

Відповіді:


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

Коли цикл час закінчується, Kі Jмають їх остаточне значення. Якщо вони обоє порожні, це краватка; інакше перемагає непуста армія. Це обробляється останнім фрагментом коду:

?K1?J2Z

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

Це воно!



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 за нічия


Чи можете ви додати відформатовану / розширену версію? 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"));


Щойно зауважив, що поточна версія не може оцінити зв’язки, що могла версія 316 байт. Я перегляну це
Hankrecords
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.