편지의 전투


9

당신의 임무는 간단합니다 : 누가 편지의 전투에서 승리했는지 말해주세요.

군대

이 전투에는이 표로 요약 된 세 가지 "군대"가 있습니다.

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

부대를 나타 내기 위해 3 개의 고유 한 문자를 사용할 수 있지만이 문자가 아닌 경우 지정해야합니다.

전투

샘플 전투가 있다고 가정 해보십시오.

ABC # army 1
CBA # army 2

각 군대는 죽을 때까지 가장 왼쪽 유닛에서 반복적으로 발사됩니다. 그들은 오른쪽으로 병력으로 이동하고 반복합니다. 군이 공격 그래서 A때까지 군대 1에서 A죽은 다음으로 이동 B한 후, C. 육군 1 명 공격 C첫째, 다음 B, 다음 A. 군대가 동시에 공격을한다고 가정하면 군대는 라운드 전에 생존하고 동시에 서로를 죽일 수 있다면 항상 발사합니다. 그들은 왼쪽에서 오른쪽으로 순서대로 발사합니다.

전투는 다음과 같이 진행됩니다.

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

따라서 군대 1이 승리합니다!

입력

두 번째 줄, 첫 번째는 군대 1과 두 번째 군대 2를 나타냅니다. 반드시 같은 크기 일 필요는 없습니다.

산출

군대 1 승리, 군대 2 승리 또는 동점 일 가능성이없는 이벤트를 나타내는 고유하고 일정한 값 3 개. 그렇습니다. 마지막 부대가 서로를 죽이고 넥타이로 끝날 수 있습니다.

전투

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

표준 허점이 적용됩니다 . 전체 프로그램을 제출해야합니다.

이것은 가장 짧은 솔루션이 승리합니다.


"일정한"왜?
CalculatorFeline

또한, A비트 BC관계 BA관계 C. A값 중 하나를 변경 20하면 연결 B됩니다.
CalculatorFeline

2
다른 입력 표현을 사용할 수 있습니까? ABC 대신 012?
Grimmy

@ 그림 : 예, 글을 편집하겠습니다.
Neil A.

답변:


3

Pyth 145 97 바이트

=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

이전보다 조금 덜 순진합니다.

온라인으로 사용해보십시오!

설명 :

프로그램을 여러 부분으로 잘라 봅시다.

=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

사전 Y은 다음과 같습니다 {'A': [25, 25], 'C': [10, 50], 'B': [100, 5]}. 그때:

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

이 시점 K에서 첫 번째 군대를 나타내는 커플 목록이 있습니다. 이 목록의 각 부부는 군대의 편지이며 (health, damage)그 편지를위한 것입니다. J정확히 같지만 두 번째 군대도 마찬가지입니다 g두 군대를 가져 가서 두 번째 군대의 피해를 첫 번째 군대에 처리하는 기능입니다. 지금:

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 루프가 끝날 때 KJ최종 값을 갖는다. 둘 다 비어 있으면 넥타이입니다. 그렇지 않으면 비어 있지 않은 군대가 승리합니다. 그것은 마지막 코드 조각에 의해 처리됩니다.

?K1?J2Z

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

그게 다야!


2

하스켈 , 199 193 179 176 171 바이트

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)

온라인으로 사용해보십시오!

작은 트릭 : 모든 군대 통계를 5로 나눕니다.


0

C #, 446 바이트

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

형식화 된 버전 :

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

army1이 이기면 1을 출력하고 army2를 2로, 타이를 0으로 출력합니다.


형식화 / 확장 버전을 추가 할 수 있습니까? C #에서도 446 바이트가 높습니다. 약간 개선 될 것이라고 확신합니다.
TheLethalCoder

초보자에게는 여러 줄이 있다고 선언 int[]합니다 .`` <= 0``은 <1확실하게 동일 합니까? 당신은 필요 try-catch합니까?
TheLethalCoder

0

자바 스크립트 (ES6) - (316) 269 바이트

나는 이것이 지옥처럼 골프를 칠 수 있다고 확신하지만 이것이 내가 생각해 낸 것입니다 :) 나는 47 바이트를 면도 할 수있었습니다!

타이의 경우 0, 팀 1의 경우 1, 팀 2의 경우 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}

읽을 수있는 :

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
}

데모 :

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


현재 버전은 316 바이트 버전과의 관계를 평가할 수 없습니다. 내가 살펴볼 게
Hankrecords
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.