Pertempuran surat-surat

9

Tugas Anda sederhana: beri tahu saya siapa yang memenangkan pertempuran surat.

Pasukan

Ada tiga "pasukan" yang berbeda dalam pertempuran ini, yang diringkas oleh tabel ini.

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

Anda dapat menggunakan tiga karakter unik untuk mewakili pasukan, tetapi harus menentukan jika mereka bukan huruf-huruf ini.

Pertempuran

Misalkan kita memiliki sampel pertarungan:

ABC # army 1
CBA # army 2

Setiap tentara berulang kali menembak ke unit paling kiri, sampai mati; kemudian mereka pindah ke pasukan ke kanan dan ulangi. Jadi pasukan 2 menyerang Apasukan 1 sampai Amati, lalu pindah ke B, lalu C. Serangan 1 tentara Cpertama, lalu B, kemudian A. Asumsikan tentara menyerang pada saat yang sama, dan dengan demikian pasukan akan selalu menembak jika mereka masih hidup sebelum putaran dan dapat saling membunuh pada saat yang sama. Mereka menembak secara berurutan dari kiri ke kanan.

Pertempuran akan berlangsung seperti itu:

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

Karena itu, pasukan 1 memenangkan pertempuran!

Memasukkan

Dua dawai, yang pertama mewakili pasukan 1 dan tentara kedua 2. Mereka belum tentu berukuran sama (karena siapa bilang itu pertarungan yang adil?)

Keluaran

Tiga nilai unik dan konstan untuk mewakili kemenangan pasukan 1, kemenangan tentara 2, atau acara seri yang mustahil. Ya, adalah mungkin bagi pasukan terakhir untuk saling membunuh, berakhir dengan dasi.

Pertempuran

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Celah standar berlaku . Anda harus mengirimkan program lengkap.

Ini adalah , solusi terpendek yang menang.

Neil A.
sumber
"konstan" Kenapa?
CalculatorFeline
Juga, Aketukan Bdan Cikatan Bdan Aikatan C. Mengubah salah satu dari Anilai-nilai untuk 20membuatnya mengikat B.
CalculatorFeline
2
Apakah kami diizinkan menggunakan representasi input yang berbeda? Katakan, 012 bukan ABC?
Grimmy
@ Grimy: Ya, saya akan mengedit posting.
Neil A.

Jawaban:

3

Pyth 145 97 byte

=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

Sedikit kurang naif dari sebelumnya.

Cobalah online!

Penjelasan:

Mari kita potong program menjadi beberapa bagian.

=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

Kamus Yadalah: {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Kemudian:

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

Pada titik ini, Kadalah daftar pasangan yang mewakili pasukan pertama. Setiap pasangan dari daftar ini adalah surat tentara, dan (health, damage)untuk surat itu. Jpersis sama, tetapi untuk pasukan kedua. gadalah fungsi yang mengambil dua tentara, dan menangani kerusakan yang dibuat oleh tentara kedua ke yang pertama. Sekarang:

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

Ketika loop sementara berakhir, Kdan Jmemiliki nilai akhir. Jika keduanya kosong, itu seri; jika tidak kemenangan tentara yang tidak kosong akan menang. Itu ditangani oleh bagian terakhir dari kode:

?K1?J2Z

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

Itu dia!

Jim
sumber
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)

Cobalah online!

Trik kecil: membagi semua statistik pasukan dengan 5.

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

Versi yang diformat:

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

Output 1 jika army1 menang, 2 untuk army2 dan 0 untuk dasi

LiefdeWen
sumber
Bisakah Anda menambahkan versi yang diformat / diperluas? 446 byte tinggi bahkan untuk C # Saya yakin akan ada beberapa perbaikan.
TheLethalCoder
Sebagai permulaan Anda memiliki beberapa baris menyatakan int[]saya pikir Anda dapat menggabungkan mereka, `` <= 0` sama seperti yang <1pasti? Apakah Anda memerlukannya try-catch?
TheLethalCoder
0

Javascript (ES6) - 316 269 ​​Bytes

Saya yakin ini bisa bermain golf seperti neraka, tapi inilah yang saya hasilkan :) Saya berhasil mencukur 47 byte!

Output 0 untuk dasi, 1 untuk Tim 1 dan 2 untuk Tim 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}

Dapat dibaca :

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

Terima kasih
sumber
Hanya memperhatikan bahwa versi saat ini tidak dapat mengevaluasi ikatan, yang dapat dilakukan oleh versi 316 byte. Saya akan memeriksanya
Hankrecords