दो प्राणियों के बीच एक लड़ाई का अनुकरण करें


16

आपका स्वागत है, बहादुर कोड गोल्फर! आज आप एक महान युद्ध और एक योगिनी के बीच में खड़े होंगे!

    goblin attacks elf!
    elf dodges!
    elf attacks goblin!
    elf hits goblin for 13 damage!
    goblin has 37 health left.
    goblin attacks elf!
    goblin hits elf for 1 damage!
    elf has 49 health left.
    elf attacks goblin!
    elf hits goblin for 19 damage!
    goblin has 18 health left.
    goblin attacks elf!
    goblin hits elf for 26 damage!
    elf has 23 health left.
    elf attacks goblin!
    elf hits goblin for 20 damage!
    goblin has been slain!

चुनौती

आपकी चुनौती ऊपर की तरह एक लड़ाई का अनुकरण करना है। आप इस रूप में इनपुट प्राप्त करेंगे:

creatureName health strength defense accuracy agility

उदाहरण के लिए, भूत और योगिनी के बीच लड़ाई होगी:

goblin 50 40 35 3 2 elf 50 35 30 4 5

पहले और दूसरे जीव बारी-बारी से हमले करेंगे।

  • प्रिंट 'प्राणीनाम अन्य हमलों पर हमला!
  • यह देखने के लिए जांचें कि क्या प्राणी चकमा देता है। प्राणी एक हमले को चकमा देगा अगर (उसकी चपलता रैंड () 2 से विभाजित) हमलावर की सटीकता की रैंड () से अधिक है।
    • अगर प्राणी चकमा देता है, तो प्रिंट करें 'प्राणीनाम चकमा दे रहा है!'
    • अन्यथा, घटाना (हमलावर की ताकत बार रैंड) () और (रक्षक की रक्षा समय रैंड) 2 से विभाजित करके नुकसान की गणना करें। न्यूनतम क्षति 1. प्रिंट है 'creatureName अन्य हिट के लिए क्रिएटनाम (x) क्षति!' फिर प्रिंट 'creatureName है (x) स्वास्थ्य छोड़ दिया।' जब तक प्राणी का स्वास्थ्य 0 या उससे कम न हो, तब तक ...
      • यदि प्राणी का स्वास्थ्य 0 या उससे कम है, तो प्रिंट करें 'creatName धीमा हो गया है!' और कार्यक्रम समाप्त करें।

नियम

  • सबसे छोटा कोड जीतता है।
  • सचमुच 'प्राणीनाम' को न छापें, लेकिन इसे प्राणी के नाम से बदल दें। '(X) क्षति' या '(x) स्वास्थ्य न छापें?' उन्हें वास्तविक राशि से बदलें। (मुझे इसे निर्दिष्ट करना होगा क्योंकि कुछ लोग नियमों को झुकने के साथ बहुत रचनात्मक हैं ।: पी)

2
चपलता और रक्षा को रोककर युक्ति को जटिल क्यों किया जाए?
पीटर टेलर

@Peter क्योंकि अन्यथा लड़ाई बहुत लंबी हो गई।
दरवाज़े

2
मेरी बात यह थी कि इनपुट को उदाहरण के लिए क्यों नहीं बदला जाए goblin 50 40 18 3 2 elf 50 35 15 4 5?
पीटर टेलर

@Peter मेह, कि बस बहुत अजीब लग रहा था - रक्षा इतना कम क्यों होगा? वैसे भी, यह एक पहेली है; नहीं करने का कोई कारण: पी
दरवाज़े

मुझे लगता है कि यह स्पष्ट नहीं है कि 'प्राणी का नाम (x) स्वास्थ्य बचा है या नहीं।' अंतिम राउंड पर प्रिंट किया जाना चाहिए (जब प्राणी धीमा होता है), और मामले में यह (मुझे यह नहीं मानना ​​चाहिए) अगर (x) हमेशा 0 होना चाहिए या यह एक नकारात्मक संख्या हो सकती है।
महामारी

जवाबों:


4

एपीएल ( 249 244 242)

इस बार प्रक्रियात्मक शैली, इसलिए (Dyalog में कम से कम) आपको इसे एक संपादक विंडो में पेस्ट करना होगा। मैंने इसे नाम दिया G(पहली पंक्ति का नाम है, मैंने इसे शामिल किया है क्योंकि यह संपादक विंडो में दिखाता है कि इसे संभवतः गिना जाना चाहिए)।

जी
⎕ML ← 3
DA, {(⊂ ↑ ⍵), ↓1 ⊂ ⊂} ← ⍴ 2 6'A≠ '' ⊂⍨ A ← ⊂
→ 5
⎕ ← (↑ डी) 'बचाते!'
ई ← डीए
⎕ ← (↑ ए) 'हमलों', '!', ⍨ ↑ डी
→ 4 / ⍨> /? एक [6], डी [5]
⎕ ← एक [1], 'हिट', डी [1], 'के लिए', 'नुकसान!', ⍨D [2] - ← 1⌈ - / ए [3], ⌈D [4] ÷ 2
→ 12 / ⍨D [2] ≤0
⎕, D [1], 'has', D [2], 'health left!'
→ 5
⎕ sl D [1], 'मारे गए!'

(संपादित करें: लाइन लेबल के बजाय संख्यात्मक GOTO का उपयोग किया जाता है। यह पता चलता है कि (Dyalog में कम से कम) सभी लेबल X:को परिभाषित करता है Xजो लाइन नंबर पर सेट है, इसलिए हो सकता है कि सीधे संख्याओं का उपयोग करें।)


6

पर्ल, 254 + 1

for((@a[0..5],@b)=split;$a[1]>0;@c=@a,@a=@b,@b=@c){say"$a[0] attacks $b[0]!\n",rand$b[5]/2<rand$a[4]?do{($==rand($a[2])-rand$b[3]/2)<1and$==1;"$a[0] hits $b[0] for $= damage!\n$b[0] has ",($b[1]-=$=)>0?"$b[1] health left.":"been slain!"}:"$b[0] dodges!"}

perl -nM5.010(या perl -nE '<code>') के साथ भागो । प्रति मेटा , -nस्विच एक अतिरिक्त वर्ण के रूप में गिना जाता है। इस कोड में कोई फैंसी गोल्फिंग ट्रिक्स नहीं है, सिवाय इसके कि शायद $=एक को बचाने के लिए क्षति चर के रूप में उपयोग किया जाए int

संपादित करें: उम्मीद है, क्षति गणना अभी सही है।


6

कॉफीस्क्रिप्ट 454 432

bपरिणाम प्राप्त करने के लिए एक स्ट्रिंग पास करें । मुझे लगा कि ग्राफिक एनिमेटेड आउटपुट करना अधिक मजेदार होगा, इसलिए मैंने एक डेमो डाला। आंकड़ों और नामों को बदलने के लिए बस इनपुट बॉक्स को बदलें। Jpg.to से तस्वीरें जो अनौपचारिक गूगल-छवियां एपीआई है।

सुपर एक्शन डेमो

लड़ाई में लड़ाई सिम्युलेटर

b=(s)->
 r=Math.random
 p=s.split ' '
 n=p.map Number
 l=''
 o=(x...)->l+=x.join(' ')+'!\n'
 while 1|i=!i
  c=(x)->n[i*6+x]*r()
  d=(x)->n[(i||6)+x]*r()
  t=->d(4)/2>c 5
  h=->Math.max c(2)-d(3)/2,1
  a=p[i*6]
  b=p[6+i*-6]
  o a,'attacks',b
  if c(5)/2>d 4
   e=Math.ceil h()
   q=n[(i||6)+1]-=e
   o a,'hits',b,'for',e,'damage'
   o b,'has',q,'health left'if q>0
  else
   o b,'dodges'
  if q<1
   o b,'has been slain'
   break
 l

अनुशंसित इनपुट (अपना खुद का सुझाव दें):

charmander 50 40 25 3 2 bulbasaur 90 30 40 4 5
voldemort 9999 10 5 1 1 batman 20 50 10 1010 30

वाह बहुत अच्छा है! : डि इस जवाब को स्वीकार करेंगे अगर मैं दो को स्वीकार कर सकता है, लेकिन मैं नियमों में कहा गया है कि कम से कम स्वीकार कर लिया जाएगा, और मैं केवल एक ही जवाब :( तो +1 स्वीकार कर सकते हैं और। voldemort 9999Haha: डी
दरवाज़े

@Doorknob, अतिरिक्त बोनस के रूप में, आप इसे जैसे चाहे संख्या दे सकते हैं 10e42, लेकिन आपका ब्राउज़र फ्रीज हो सकता है ...
ब्रिगैंड

6

रूबी, 292 264

v=$*
def p*a;puts a*' 'end
loop{a,b=v[0],v[6]
w=v.map &:to_i
p a,:attacks,b+?!
w[11]*rand/2>w[4]*rand ? (p b,:dodges!):(h=v[7]=w[7]-=d=[rand(w[2])-rand(w[9])/2,1].max
p a,:hits,b,:for,d,:damage!
p b,:has,h<1?"been slain!":"#{h} health left."
h<1&&exit)
v.rotate!6}

मेरा पहला कोड गोल्फ प्रविष्टि; कैसे यह विधि परिभाषा परस है मेरे परे है :)

क्या कमांड-लाइन मापदंडों (जैसे ruby battle.rb goblin 50 40 35 3 2 elf 50 35 30 4 5) से इनपुट को पढ़ना ठीक है ?

Ideone चलाते हैं


हाँ, यह ठीक है।
दरवाज़े

5

जावास्क्रिप्ट; 347 341 333

जैसा कि मैं हमेशा करता हूं, मैं अपने समाधान के साथ शुरुआत करूंगा:

for(m=prompt().split(' '),r=Math.random,a=console.log,c=0,d=6;;){if(a(m[c]+' attacks '+m[d]+'!'),r()*m[c+4]>r()*m[d+5]/2){if(a(m[c]+' hits '+m[d]+' for '+(h=Math.max(~~(r()*m[c+2]-r()*m[d+3]/2),1))+' damage!'),(m[d+1]-=h)<1){a(m[d]+' has been slain!');break}a(m[d]+' has '+m[d+1]+' health left.')}else a(m[d]+' dodges!');t=c;c=d;d=t}

संपादित करें: जाहिरा तौर console.logपर कुछ ब्राउज़रों पर एक वैरिएबल ब्रेक करने के लिए असाइन किया गया है, इसलिए यहां एक ही कोड एक फ़ंक्शन घोषणा के साथ है:

for(m=prompt().split(' '),r=Math.random,a=function(x){console.log(x)},c=0,d=6;;){if(a(m[c]+' attacks '+m[d]+'!'),r()*m[c+4]>r()*m[d+5]/2){if(a(m[c]+' hits '+m[d]+' for '+(h=Math.max(~~(r()*m[c+2]-r()*m[d+3]/2),1))+' damage!'),(m[d+1]-=h)<1){a(m[d]+' has been slain!');break}a(m[d]+' has '+m[d+1]+' health left.')}else a(m[d]+' dodges!');t=c;c=d;d=t}

मैं इसे बदलने की सोच रहा था alert, लेकिन यह सिर्फ बुराई होगी: पी


मैं एक मिल Uncaught TypeError: Illegal invocationकी वजह से a=console.log। क्या आपको consoleसंदर्भ के रूप में वस्तु को बांधना होगा , जैसे a=console.log.bind(console)?
C5H8NNaO4

@ C5H हम्म, यह अजीब है। इससे मेरा काम बनता है।
दरवाज़े

बस इसे फ़ायरफ़ॉक्स, सफारी और क्रोम में चेक किया, फ़ायरफ़ॉक्स में यह काम करता है =) क्रोम मुझे ऊपर देता है, और सफारी एक
टाइपएयर

@ C5H :( शायद मैं से बदलने सकता है alert, लेकिन यह बहुत कष्टप्रद हो सकता है: पी
दरवाज़े

: पी हाँ जो वास्तव में कष्टप्रद होगा, लेकिन कम से कम यह "6" वर्णों को बचाएगा और TypeError =) से बचा जाता है, लेकिन मुझे लगता है कि इसकी Ok, कम से कम यह फ़ायरफ़ॉक्स = पर चलती है)
C5H8NNOO4

4

अजगर: 393

मैं थोड़ा कठिन निचोड़ा, अगर मेरे पास 3 था तो मैं शायद print = pइसे कुछ और कम कर सकता था , लेकिन मुझे नहीं लगता कि इस में बहुत कुछ बचा है।

393:

from random import randrange as r
x = input().split()
t=range
a,b=6,0
for i in t(1,6)+t(7,12):x[i]=int(x[i])
while x[b+1] > 0:
 a,b=b,a;print x[a]+" attacks "+x[b]
 if r(x[a+5]/2)>r(x[b+5]):print x[a]+' dodges!';continue
 d=max(r(x[a+2])-r(x[b+3]/2),1);print x[a]," hits ",x[b]," for ",d," damage!";x[b+1]-=d
 if x[b+1]>0:print x[b]," has ",x[b+1]," health left."
print x[b]," has been slain"

399:

from random import randrange as r
x = raw_input().split()
t=range
a,b=6,0
for i in t(1,6)+t(7,12):x[i]=int(x[i])
while x[b+1] > 0:
 a,b=b,a;print x[a]+" attacks "+x[b]
 if r(x[a+5]/2) > r(x[b+5]):print x[a]+' dodges!';continue
 d=max(r(x[a+2])-r(x[b+3]/2),1);print x[a]," hits ",x[b]," for ",d," damage!";x[b+1]-=d                        if x[b+1]>0:print x[b]," has ",x[b+1]," health left."
print x[b]," has been slain"

मुझे लगता है कि लोग लंघन कर रहे हैं कि यदि आपके पास लूप की अच्छी स्थिति है, तो आपको यह जांचने की आवश्यकता नहीं है कि क्या लक्ष्य स्वास्थ्य से कम है।


मैं दो बार स्वास्थ्य की जांच करता हूं, लड़ाई खत्म करने के लिए लूप हैडर में, और लूप में या तो "स्लेड" या "हिट ..." प्रिंट करना है, क्योंकि डबल हेल्थ चेक एक अतिरिक्त
कंसोल

4

जावास्क्रिप्ट: 340 306

339:

for(m=Math.random,a=prompt().split(" "),c=[a,a.splice(6)],e;0<+c[0][1]&&0<+c[1][1];)c.reverse(),console.log(c[0][0]+" attacks "+c[1][0]+"!\n"+(c[0][4]*m()<c[1][5]*m()/2?c[1][0]+" dodges!":c[0][0]+" hits "+c[1][0]+" for "+(e=1+(c[0][2]*m()-c[1][3]*m()/2|0))+" damage!\n"+c[1][0]+" has "+(0>(c[1][1]-=e)?"been slain!":c[1][1]+" health left.")))

306:

for(var m=Math.random,a=prompt().split(" "),b=a.splice(6),d,e;0<+a[1]&&0<+b[1];d=a,a=b,b=d)console.log(a[0]+" attacks "+b[0]+"!\n"+(a[4]*m()<b[5]*m()/2?b[0]+" dodges!":a[0]+" hits "+b[0]+" for "+(e=a[2]*m()-b[3]*m()/2|0,e<=0?e=1:e)+" damage!\n"+b[0]+" has "+(0>(b[1]-=e)?"been slain!":b[1]+" health left.")))

नमूना उत्पादन:

goblin attacks elf!
elf dodges!
elf attacks goblin!
elf hits goblin for 21 damage!
goblin has 29 health left.
goblin attacks elf!
elf dodges!
elf attacks goblin!
elf hits goblin for 15 damage!
goblin has 14 health left.
goblin attacks elf!
goblin hits elf for 1 damage!
elf has 49 health left.
elf attacks goblin!
elf hits goblin for 16 damage!
goblin has been slain!   

नोट्स संपादित करें: +1 वर्ण, मैं "!" "dodges" के बाद
ओह और मैं वास्तव में "नमूना आउटपुट" के बाद एक आउटपुट डालना भूल
गया, हेडर को जावास्क्रिप्ट में बदल दिया, जैसा कि @tbodt बताता है


लोगों को भ्रमित करने से बचने के लिए आप इसे जावास्क्रिप्ट क्यों नहीं कहते हैं?
tbodt

@tbodt मैंने नहीं सोचा था कि यह लोगों को भ्रमित करेगा =) इसे जावास्क्रिप्ट में बदल दिया
C5H8NNOO4

3

आर: 387 वर्ण

a=scan(,"");i=as.integer;r=runif;C=cat;X=data.frame(i(a[2:6]),i(a[8:12]));z=1;Y=c(a[1],a[7]);repeat{p=1+z%%2;n=X[,p];m=X[,-p];N=Y[p];M=Y[-p];C(N,"attacks",M,"\n");if(r(1)*n[5]<r(1)*m[5]/2){C(M,"dodges!\n")}else{C(N,"hits",M,"for",d<-max(round(n[2]*r(1)-m[3]*r(1)/2),1),"damages!\n");h=max(m[1]-d,0);if(h){C(M,"has",X[1,-p]<-h,"health left\n")}else{C(M,"has been slained!");break}};z=z+1}

या पूरी तरह से विकसित, इंडेंटेशन और टिप्पणियों के साथ, चीजों को स्पष्ट करने के लिए:

a=scan(,"")                        # Read stdin as character vector
i=as.integer
r=runif
C=cat
X=data.frame(i(a[2:6]),i(a[8:12])) # Data frame with opponents stats
z=1                                # Turn counter 
Y=c(a[1],a[7])                     # Vector of opponents name
repeat{                            # shorter than while(T)
    p=1+z%%2                       # R indexing starts with 1 not 0
    n=X[,p]                        # Attacking opponent stats
    m=X[,-p]                       # Defending opponent stats
    N=Y[p]                         # Attacking opponent name
    M=Y[-p]                        # Defending opponent name
    C(N,"attacks",M,"\n")          # By default, cat separates elements with a space
    if(r(1)*n[4]<r(1)*m[5]/2){
        C(M,"dodges!\n")
    }else{
        C(N,"hits",M,"for",d<-max(round(n[2]*r(1)-m[3]*r(1)/2),1),"damages!\n")
        h=max(m[1]-d,0)            # Health after the strike
        if(h){                     # If health is not 0
            C(M,"has",X[1,-p]<-h,"health left\n")
        }else{                     # If it is
            C(M,"has been slained!")
            break
            }
    }
    z=z+1
}

2

C # - 464 453 वर्ण

इस पर कुछ रातों के बाद मैं दूसरी प्रविष्टियों के करीब भी नहीं जा सकता (सी # के लिए आश्चर्य की बात नहीं)। अभी भी कमरे में सुधार के लिए मुझे संदेह है। विशेष रूप से चालाक चाल नहीं।

using System;using System.Linq;class P{static void Main(string[]a){int D,h=1,z=6;
var n=a.Select(x=>int.TryParse(x,out D)?D:0).ToList();var r=new Random();Func<int>
R=()=>r.Next(101);for(;h>0;z=z>0?0:6){D=(n[8-z]*R()-n[3+z]*R()/2)/100;var d=n[5+z]
*R()/2>n[10-z]*R();h=d?h:n[1+z]-=D=D<1?1:D;Console.Write("{0} attacks {1}!\n"+(d?
"{1} dodges!\n":"{0} hits {1} for {2} damage!\n")+(d?"":"{1} has {3}\n"),a[6-z],a
[z],D,h>0?h+" health left.":"been slain!");}}}

टिप्पणी की:

using System;
using System.Linq;
class P
{
    static void Main(string[] a)
    {
        int D, // string to int parsing and attack damage 
            h = 1, // health 
            z = 6; // index

        // painful requirement to convert the input strings to integers
        var n = a.Select(x => int.TryParse(x, out D) ? D : 0).ToList();

        // set up a function to return a new random number
        var r = new Random();
        Func<int> R = () => r.Next(101);

        // we'll exit the loop when the defender's health (h) is <= 0.
        // z is used as an index offset to get values out of the list, it flips between 0 an 6 each round
        for (; h > 0; z = z > 0 ? 0 : 6)
        {
            // calculate damage
            D = (n[8 - z] * R() - n[3 + z] * R() / 2) / 100;

            // see if defender dodges
            var d = n[5 + z] * R() / 2 > n[10 - z] * R();

            // subtract health from defender if necessary. store health of defender in h
            h = d ? h : n[1 + z] -= D = D < 1 ? 1 : D;

            // print the round
            Console.Write(
                "{0} attacks {1}!\n" + (d ? "{1} dodges!\n" : "{0} hits {1} for {2} damage!\n") + 
                (d ? "" : "{1} has {3}\n"), a[6 - z], a[z], D, h > 0 ? h + " health left." : "been slain!");
        }
    }
}

1

पायथन 3, 314

from random import*
r=random
p=print
I=input().split()
H=1
while H>0:s,a,H,D,G=map(int,I[2:5:2]+I[7::2]);N=I[6];p(I[0],"attacks",N+"!");I=I[6:]+I[:6];X=max(int(s*r()-D*r()/2),1)*(G*r()/2<a*r());I[1]=H=H-X;X<1and p(N,"dodges!")or p(I[6],"hits",N,"for",X,"damage!\n"+N,"has",["been slain!","%s health left."%H][H>0])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.