手紙の戦い


9

あなたの仕事は簡単です:手紙の戦いに勝った人を教えてください。

軍隊

この戦闘には3つの異なる「部隊」があり、この表に要約されています。

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

部隊を表すために3つの固有の文字を使用できますが、これらの文字でないかどうかを指定する必要があります。

戦い

サンプルの戦闘があるとします。

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番目の軍2を表す2つのストリング。それらは必ずしも同じサイズではありません(だれが公正な戦いだと言ったので?)

出力

軍1の勝利、軍2の勝利、またはタイのあり得ない出来事を表す3つの一意の定数値。はい、最後の部隊がお互いを殺してネクタイで終わる可能性があります。

戦い

ABC
CBA
Army 1

CCCCC
CCCCC
Tie

CABCAB
ABBABBA
Army 2

標準の抜け穴が適用されます。完全なプログラムを提出する必要があります。

これは、最短のソリューションの勝利です。


「一定」なのはなぜですか?
— CalculatorFeline

また、AビートBとCネクタイBとAネクタイC。いずれかAの値をに変更20すると、関連付けられBます。
— CalculatorFeline

2
別の入力表現を使用できますか?ABCの代わりに012と言いますか?
— Grimmy、2017年

@Grimy:はい、投稿を編集します。
— 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まったく同じですが、第2軍用です。gは、2つの軍を奪取し、第2軍によるダメージを第1軍に与える機能です。今:

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ループが終了し、最終的な値KをJ持っているとき。それらが両方とも空の場合、それは引き分けです。そうでなければ空でない軍隊が勝利する。これは最後のコードで処理されます。

?K1?J2Z

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

それでおしまい!


2

Haskell、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、Tieの場合は0を出力します


フォーマット済み/拡張バージョンを追加できますか?C#でも446バイトは大きいです。いくつかの改善点があると確信しています。
— TheLethalCoder 2017年

手始めに、複数の行を宣言しint[]ているので、それらを組み合わせることができると思います、「<= 0」は<1確かに同じですか?あなたは必要try-catchですか?
— TheLethalCoder 2017年

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、2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.