Bitwa liter

9

Twoje zadanie jest proste: powiedz mi, kto wygrywa bitwę liter.

Żołnierze

W tej bitwie są trzy różne „wojska”, podsumowane w tej tabeli.

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

Możesz użyć dowolnych trzech unikalnych znaków do reprezentowania żołnierzy, ale musisz określić, czy nie są to te litery.

Walka

Załóżmy, że mamy próbną bitwę:

ABC # army 1
CBA # army 2

Każda armia wielokrotnie strzela do lewej jednostki, aż do śmierci; następnie przechodzą do oddziału po prawej i powtarzają. Więc armii 2 ataki Aw armii 1, dopóki Anie żyje, a następnie przejść do B, następnie C. 1 Armia atakuje Cpierwszy, potem B, potem A. Załóżmy, że armie atakują w tym samym czasie, a zatem wojska zawsze będą strzelały, jeśli były żywe przed rundą i mogą się nawzajem zabijać. Strzelają w kolejności od lewej do prawej.

Bitwa przebiegałaby w następujący sposób:

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

Dlatego armia 1 wygrywa bitwę!

Wejście

Dwie struny, pierwsza reprezentująca armię 1 i druga armię 2. Nie są koniecznie tej samej wielkości (bo kto powiedział, że to będzie uczciwa walka?)

Wynik

Dowolne trzy unikalne, stałe wartości reprezentujące zwycięstwo armii 1, zwycięstwo armii 2 lub mało prawdopodobne remis. Tak, ostatnie oddziały mogą się nawzajem zabić, co kończy się remisem.

Bitwy

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Obowiązują standardowe luki . Musisz przesłać pełny program.

To jest wygrywa najkrótsze rozwiązanie.

Neil A.
źródło
„stały” Dlaczego?
CalculatorFeline
Ponadto, Abije Bi Ckrawaty Bi Akrawaty C. Zmiana którejkolwiek z Atych wartości 20spowoduje, że będzie ona powiązana B.
CalculatorFeline
2
Czy wolno nam użyć innej reprezentacji danych wejściowych? Powiedz, 012 zamiast ABC?
Grimmy
@Grimy: Tak, zmienię post.
Neil A.

Odpowiedzi:

3

Pyth 145 97 bajtów

=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

Trochę mniej naiwny niż wcześniej.

Wypróbuj online!

Objaśnienia:

Wytnijmy program na kilka części.

=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

Słownik Yjest: {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Następnie:

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

W tym momencie Kznajduje się lista par, która reprezentuje pierwszą armię. Każda para z tej listy jest listem armii i dotyczy (health, damage)tego listu. Jjest dokładnie taki sam, ale dla drugiej armii. gto funkcja, która bierze dwie armie i zadaje obrażenia zadane przez drugą armię pierwszej. Teraz:

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

Kiedy pętla while się skończy Ki będzie Jmiała swoją ostateczną wartość. Jeśli oba są puste, to remis; w przeciwnym razie wygrywa niepusta armia. Jest to obsługiwane przez ostatni fragment kodu:

?K1?J2Z

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

Otóż ​​to!

Jim
źródło
2

Haskell , 199 193 179 176 171 bajtów

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)

Wypróbuj online!

Mała sztuczka: podzielił wszystkie statystyki armii przez 5.

bartavelle
źródło
0

C #, 446 bajtów

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

Wersja sformatowana:

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

Wykazuje 1, jeśli armia 1 wygra, 2 dla armii 2 i 0 dla remisu

LiefdeWen
źródło
Czy możesz dodać sformatowaną / rozszerzoną wersję? 446 bajtów jest wysoki nawet dla C # Jestem pewien, że będzie kilka ulepszeń.
TheLethalCoder
Na początek masz wiele linii deklarujących int[] że myślę, że możesz je połączyć, `` <= 0` jest tak samo jak na <1pewno? Potrzebujesz try-catch?
TheLethalCoder
0

JavaScript (ES6) - 316 269 ​​bajtów

Jestem pewien, że można grać w golfa jak diabli, ale to właśnie wymyśliłem :) Udało mi się jednak zgolić 47 bajtów!

Wyniki 0 dla remisu, 1 dla Drużyny 1 i 2 dla Drużyny 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}

Czytelny :

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
}

Demo :

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
źródło
Zauważyłem, że bieżąca wersja nie może ocenić powiązań, co może zrobić wersja 316-bajtowa.
Przyjrzę