Trận chiến của những lá thư


9

Nhiệm vụ của bạn rất đơn giản: cho tôi biết ai là người chiến thắng trong cuộc chiến của những lá thư.

Lính quân đội

Có ba "đội quân" khác nhau trong trận chiến này, được tóm tắt bởi bảng này.

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

Bạn có thể sử dụng bất kỳ ba ký tự duy nhất để đại diện cho quân đội, nhưng phải chỉ định nếu chúng không phải là những chữ cái này.

Trận chiến

Giả sử chúng ta có một trận chiến mẫu:

ABC # army 1
CBA # army 2

Mỗi đội quân liên tục bắn vào đơn vị ngoài cùng bên trái, cho đến khi nó chết; sau đó họ di chuyển sang đoàn quân bên phải và lặp lại. Vì vậy, đội quân 2 tấn công Atrong quân đội 1 cho đến khi Achết, sau đó chuyển sang B, sau đó C. Quân 1 tấn công Ctrước, sau đóB , sau đó A. Giả sử quân đội tấn công cùng một lúc, và do đó, quân đội sẽ luôn khai hỏa nếu họ còn sống trước vòng đấu và có thể giết nhau cùng một lúc. Họ bắn theo thứ tự từ trái sang phải.

Trận chiến sẽ diễn ra như vậy:

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

Do đó, quân 1 thắng trận!

Đầu vào

Hai chuỗi, đại diện đầu tiên đại diện cho quân đội 1 và quân đội thứ hai 2. Chúng không nhất thiết phải có cùng kích thước (vì ai nói đó sẽ là một cuộc chiến công bằng?)

Đầu ra

Bất kỳ ba giá trị duy nhất, không đổi để đại diện cho đội quân 1 chiến thắng, đội quân 2 chiến thắng hoặc sự kiện không thể xảy ra của một trận hòa. Vâng, có thể cho những đội quân cuối cùng giết nhau, kết thúc bằng một trận hòa.

Trận chiến

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

Tiêu chuẩn áp dụng . Bạn phải gửi một chương trình đầy đủ.

Đây là , giải pháp ngắn nhất thắng.


"không đổi" tại sao?
Máy

Ngoài ra, Anhịp đập BCquan hệ BAquan hệ C. Thay đổi một trong hai Agiá trị để 20làm cho nó ràng buộc B.
Máy

2
Chúng tôi có được phép sử dụng một đại diện đầu vào khác nhau không? Nói, 012 thay vì ABC?
Grimmy

@Grimy: Vâng, tôi sẽ chỉnh sửa bài viết.
Neil A.

Câu trả lời:


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

Một chút ít ngây thơ hơn trước.

Hãy thử trực tuyến!

Giải thích:

Hãy cắt chương trình thành nhiều phần.

=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

Từ điển Ylà : {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. Sau đó:

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

Tại thời điểm này, Klà một danh sách các cặp vợ chồng đại diện cho quân đội đầu tiên. Mỗi cặp trong danh sách này là một lá thư của quân đội, và (health, damage)dành cho lá thư đó. Jlà hoàn toàn giống nhau, nhưng đối với quân đội thứ hai. glà một chức năng cần có hai đội quân và gây sát thương cho đội quân thứ hai lên đội quân thứ nhất. Hiện nay:

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

Khi vòng lặp while kết thúc KJcó giá trị cuối cùng của chúng. Nếu cả hai đều trống, đó là một cà vạt; nếu không thì đội quân không trống thắng. Điều đó được xử lý bởi đoạn mã cuối cùng:

?K1?J2Z

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

Đó là nó!


2

Haskell , 199 193 179 176 171 byte

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)

Hãy thử trực tuyến!

Thủ thuật nhỏ: chia tất cả các chỉ số quân đội cho 5.


0

C #, 446 byte

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

Phiên bản định dạng:

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

Kết quả 1 nếu army1 thắng, 2 cho army2 và 0 cho tie


Bạn có thể thêm một phiên bản định dạng / mở rộng? 446 byte là cao ngay cả đối với C # Tôi chắc chắn sẽ có một số cải tiến.
TheLethalCoder

Đối với người mới bắt đầu, bạn có nhiều dòng khai báo int[]Tôi nghĩ rằng bạn có thể kết hợp chúng, `` <= 0` có giống như <1chắc chắn không? Bạn có cần try-catch?
TheLethalCoder

0

Javascript (ES6) - 316 269 ​​byte

Tôi chắc chắn rằng điều này có thể được chơi như địa ngục, nhưng đây là những gì tôi đã nghĩ ra :) Tôi đã cố gắng để loại bỏ 47 byte!

Đầu ra 0 cho hòa, 1 cho Đội 1 và 2 cho Đội 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}

có thể đọc được :

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
}

Bản trình diễn :

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


Chỉ cần lưu ý rằng phiên bản hiện tại không thể đánh giá các mối quan hệ, mà phiên bản 316 byte có thể. Tôi sẽ xem xét nó
Hankrecords
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.