信件之战


9

您的任务很简单:告诉我谁赢得了信件之战。

部队

下表总结了这场战斗中的三个不同“部队”。

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

您可以使用任何三个唯一字符代表部队,但必须指定他们是否不是这些字母。

战争

假设我们有一个简单的战斗:

ABC # army 1
CBA # army 2

每支部队反复向最左边的单位开火,直至死亡。然后他们向右移动,然后重复。所以,军队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军胜利或平局的不太可能发生的任何三个唯一且恒定的值。是的,最后一支部队有可能互相打死,打成平局。

战役

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

适用标准漏洞。您必须提交完整的程序。

这是 ,最短的解决方案获胜。


“恒定”为什么?
CalculatorFeline

此外,A节拍BC纽带BA联系C。更改其中一个A的值20将使其平局B
CalculatorFeline

2
我们可以使用其他输入表示形式吗?说012,而不是ABC?
Grimmy

@Grimy:是的,我将编辑帖子。
尼尔·A·

Answers:


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

使用Javascript(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.