การต่อสู้ของตัวอักษร


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เต้นBและCความสัมพันธ์BและความผูกพันA Cการเปลี่ยนแปลงอย่างใดอย่างหนึ่งAของค่าจะทำให้มันผูก20 B
CalculatorFeline

2
เราได้รับอนุญาตให้ใช้การแทนค่าอินพุตอื่นหรือไม่? พูด 012 แทนที่จะเป็น ABC?
Grimmy

@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เหมือนกันหมด แต่สำหรับกองทัพที่สอง 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 สิ้นสุดลง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;
            };

เอาท์พุต 1 ถ้ากองทัพ 1 ชนะ 2 สำหรับกองทัพ 2 และ 0 สำหรับเสมอกัน


คุณสามารถเพิ่มเวอร์ชันที่จัดรูปแบบ / ขยายได้หรือไม่ 446 ไบต์สูงแม้สำหรับ C # ฉันแน่ใจว่าจะมีการปรับปรุงบางอย่าง
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.