Batalha das letras

9

Sua tarefa é simples: diga-me quem vence a batalha das letras.

As tropas

Existem três "tropas" diferentes nesta batalha, resumidas por esta tabela.

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

Você pode usar três caracteres únicos para representar as tropas, mas deve especificar se não são essas letras.

A batalha

Suponha que tenhamos uma amostra de batalha:

ABC # army 1
CBA # army 2

Cada exército dispara repetidamente na unidade mais à esquerda, até que esteja morta; então eles se movem para a tropa à direita e repetem. Portanto, o exército 2 ataca Ano exército 1 até que Aesteja morto, então vá para B, então C. O Exército 1 ataca Cprimeiro, então B, então A. Suponha que os exércitos atacem ao mesmo tempo e, assim, as tropas sempre dispararão se estiverem vivas antes da rodada e possam se matar ao mesmo tempo. Eles disparam em ordem da esquerda para a direita.

A batalha seria assim:

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

Portanto, o exército 1 vence a batalha!

Entrada

Duas cordas, a primeira representando o exército 1 e o segundo exército 2. Elas não são necessariamente do mesmo tamanho (porque quem disse que seria uma luta justa?)

Resultado

Quaisquer três valores constantes únicos para representar o exército 1 vencendo, o exército 2 vencendo ou o improvável evento de empate. Sim, é possível que as últimas tropas se matem, terminando em empate.

Batalhas

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Aplicam-se brechas padrão . Você deve enviar um programa completo.

Este é o , a solução mais curta vence.

Neil A.
fonte
"constante" Por quê?
CalculatorFeline
Além disso, Abatidas Be Cgravatas Be Agravatas C. Alterar um dos Avalores de para 20torná-lo empate B.
CalculatorFeline
2
Temos permissão para usar uma representação de entrada diferente? Diga 012 em vez de ABC?
Grimmy
@ Grimy: Sim, vou editar o post.
Neil A.

Respostas:

3

Pyth 145 97 bytes

=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

Um pouco menos ingênuo do que antes.

Experimente online!

Explicações:

Vamos cortar o programa em várias partes.

=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

O dicionário Yé: {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Então:

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

Neste ponto, Khá uma lista de casais que representa o primeiro exército. Cada par desta lista é uma carta do exército e é (health, damage)para essa carta. Jé exatamente o mesmo, mas para o segundo exército. gé uma função que leva dois exércitos e causa o dano causado pelo segundo exército ao primeiro. Agora:

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

Quando o loop while terminar Ke Jtiver seu valor final. Se ambos estão vazios, é um empate; caso contrário, o exército não vazio vencerá. Isso é tratado pelo último trecho de código:

?K1?J2Z

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

É isso aí!

Jim
fonte
2

Haskell , 199 193 179 176 171 bytes

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)

Experimente online!

Truque pequeno: divida todas as estatísticas do exército por 5.

bartavelle
fonte
0

C #, 446 bytes

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

Versão formatada:

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

Produz 1 se exército1 vencer, 2 para exército2 e 0 para empate

LiefdeWen
fonte
Você pode adicionar uma versão formatada / expandida? 446 bytes é alto, mesmo para C #, tenho certeza de que haverá algumas melhorias.
TheLethalCoder
Para iniciantes, você tem várias linhas declarando int[]que acho que você pode combiná-las, `` <= 0` é o mesmo que <1certamente? Você precisa do try-catch?
TheLethalCoder
0

Javascript (ES6) - 316 269 ​​bytes

Eu tenho certeza que isso pode ser jogado como o inferno, mas é isso que eu criei :) Eu consegui raspar 47 bytes!

Saídas 0 para empate, 1 para o Time 1 e 2 para o Time 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}

Legível :

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
fonte
Acabei de notar que a versão atual não pode avaliar laços, o que a versão de 316 bytes poderia. Eu vou olhar para ele
Hankrecords