Harflerin Savaşı


9

Göreviniz basit: Bana harflerin savaşını kimin kazandığını söyle.

Birlikler

Bu savaşta, bu tablo ile özetlenen üç farklı "birlik" vardır.

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

Birlikleri temsil etmek için herhangi üç benzersiz karakter kullanabilirsiniz, ancak bu harfler olup olmadıklarını belirtmelisiniz.

Savaş

Örnek bir savaşımız olduğunu varsayalım:

ABC # army 1
CBA # army 2

Her ordu ölene kadar en soldaki birimde tekrar tekrar ateş eder; sonra sağa doğru birliğe geçip tekrar ederler. Ordu 2 saldırıları Yani Akadar orduda 1'de Aöldü, sonra geçmek B, sonra C. Ordu 1 saldırılar C, sonra B, sonra A. Orduların aynı anda saldırdığını varsayın ve böylece birlikler turdan önce hayatta kalırlarsa ve aynı anda birbirlerini öldürebilirlerse ateş ederler. Soldan sağa doğru ateş ediyorlar.

Savaş şu şekilde olur:

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

Bu nedenle, ordu 1 savaşı kazanır!

Giriş

Biri ordu 1'i ve ikinci ordu 2'yi temsil eden iki tel. Bunlar aynı büyüklükte değillerdir (çünkü bunun adil bir mücadele olacağını kim söyledi?)

Çıktı

Ordu 1 kazanma, ordu 2 kazanma veya olası bir beraberlik olayını temsil eden üç benzersiz, sabit değer. Evet, son birliklerin birbirlerini öldürmesi, beraberlikle bitmesi mümkündür.

Savaşlar

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Standart boşluklar geçerlidir . Tam bir program göndermelisiniz.

Bu , en kısa çözüm kazanır.


"sabit" Neden?
CalculatorFeline

Ayrıca, Aritimler B, Ckravatlar Bve Akravatlar C. ADeğerlerinden herhangi birinin değiştirilmesi 20, onu birbirine bağlar B.
CalculatorFeline

2
Farklı bir giriş gösterimi kullanmamıza izin var mı? Söyle, ABC yerine 012?
Grimmy

@Grimy: Evet, yazıyı düzenleyeceğim.
Neil

Yanıtlar:


3

Pyth 145 97 bayt

=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

Eskisinden biraz daha az saf.

Çevrimiçi deneyin!

açıklamalar:

Programı birkaç parçaya ayıralım.

=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özlük Ygeçerli: {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Sonra:

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

Bu noktada, Kilk orduyu temsil eden çiftlerin bir listesi. Bu listenin her çifti ordunun bir harfidir ve (health, damage)o harf içindir. Jtamamen aynı, ama ikinci ordu için. giki orduyu alan ve ikinci ordunun birinciye verdiği zararı veren bir işlevdir. Şimdi:

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 döngüsü bittiğinde Kve Json değerine sahip olduğunda. İkisi de boşsa, bu bir kravat; aksi takdirde boş olmayan ordu kazanır. Bu, son kod parçası tarafından işlenir:

?K1?J2Z

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

Bu kadar!


2

Haskell , 199 193 179 176 171 bayt

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)

Çevrimiçi deneyin!

Küçük numara: tüm ordu istatistiklerini 5'e böldü.


0

C #, 446 Bayt

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

Biçimlendirilmiş sürüm:

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

Ordu1 kazanırsa 1, ordu2 için 2 ve kravat için 0 çıktılar


Biçimlendirilmiş / genişletilmiş bir sürüm ekleyebilir misiniz? 446 bayt C # için bile yüksek Bazı iyileştirmeler olacak eminim.
TheLethalCoder

Yeni başlayanlar int[]için, onları birleştirebileceğinizi düşündüğüm birden fazla satırınız var , `` <= 0` <1kesinlikle aynı mı? İhtiyacınız var try-catchmı?
TheLethalCoder

0

JavaScript (ES6) - 316 269 Bytes

Eminim bu cehennem gibi golf olabilir, ama ben geldim :) 47 bayt olsa tıraş başardı!

Beraberlik için 0, Takım 1 için 1 ve Takım 2 için 2 çıktılar.

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}

Okunabilir :

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"));


Mevcut sürümün, 316 baytlık sürümün bağları değerlendiremediğini fark ettim. Ben içine bakacağım
Hankrecords
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.