দুটি প্রাণীর মধ্যে একটি যুদ্ধ অনুকরণ


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. মুদ্রণ 'ক্রিয়েচারনাম অন্যকে আঘাত করে তারপরে মুদ্রণ করে 'ক্রিয়েচারনেমে (x) স্বাস্থ্য বাকি আছে।' যদি না প্রাণীর স্বাস্থ্য 0 বা তার চেয়ে কম হয়, এক্ষেত্রে ...
      • যদি প্রাণীর স্বাস্থ্য 0 বা কম হয় তবে মুদ্রণ করুন 'ক্রিয়েচারনাম মারা গেছে!' এবং প্রোগ্রাম শেষ।

বিধি

  • সংক্ষিপ্ততম কোড জিতেছে।
  • আক্ষরিকভাবে 'ক্রিয়েচারনাম' মুদ্রণ করবেন না, তবে এটি জীবের নামের সাথে প্রতিস্থাপন করুন। '(X) ক্ষতি' বা '(x) স্বাস্থ্য মুদ্রণ করবেন না;' তাদের প্রকৃত পরিমাণের সাথে প্রতিস্থাপন করুন। (আমাকে এটি উল্লেখ করতে হবে কারণ কিছু লোক নিয়মগুলি নমন করে খুব সৃজনশীল are : পি)

2
চটপটি এবং প্রতিরক্ষা অর্ধেকে রেখে কেন অনুমিতিকে জটিল করবেন?
পিটার টেলর

@ পিটার কারণ অন্যথায় যুদ্ধগুলি খুব দীর্ঘ সময় নিয়েছে।
ডুরকনব

2
আমার বক্তব্য ছিল: কেন ইনপুট যেমন পরিবর্তন করবেন না goblin 50 40 18 3 2 elf 50 35 15 4 5?
পিটার টেলর

@ পিটার মেহ, এটিকে খুব অদ্ভুত বলে মনে হয়েছিল - প্রতিরক্ষা কেন এত কম হবে? যাইহোক, এটি একটি ধাঁধা; কোনও কারণ নেই: পি
ডোরকনব

আমি মনে করি 'ক্রিয়েচারনামের (x) স্বাস্থ্য বাকি আছে কিনা' তা পরিষ্কার নয়। শেষ রাউন্ডে মুদ্রিত হওয়া উচিত (যখন প্রাণীটি মারা গেছে), এবং এটির ক্ষেত্রে (আমি ধরে নিয়েছিলাম এটি করা উচিত নয়) যদি (এক্স) সর্বদা 0 থাকে বা এটি একটি নেতিবাচক সংখ্যা হতে পারে।
মহামারী

উত্তর:


4

এপিএল ( 249 244 242)

এবার কার্যনির্বাহী শৈলী, সুতরাং (কমপক্ষে ডায়ালাগে) আপনাকে এডিটর উইন্ডোতে এটি আটকে দিতে হবে। আমি এর নাম দিয়েছি G(প্রথম লাইনটি নাম, আমি এটি অন্তর্ভুক্ত করেছি কারণ এটি সম্পাদক উইন্ডোতে এটি প্রদর্শিত হয় তাই এটি সম্ভবত গণনা করা উচিত)।

জি
⎕ML ← 3
ডিএ ← {(⊂ ↑ ⍵), ⍎¨1 ↓ ⍵} ¨ ↓ 2 6⍴A⊂⍨ '' ≠ এ ← ⍞
→ 5
⎕ ← (↑ ডি) 'dodges!'
খ্রি ← ডিএ
⎕ ← (↑ একটি) আক্রমণ ','! ', ⍨ ↑ ডি
→ 4 / ⍨> /? একটি [6], ডি [5]
⎕ ← একটি [1], 'হিট', ডি [1], 'এর জন্য', 'ক্ষতি!', ⍨D [2] - ← 1⌈ - / এ [3], ⌈D [4] ÷ 2
→ 12 / ⍨D [2] ≤0
⎕ ← D [1], 'has', D [2], 'স্বাস্থ্য বাকি!'
→ 5
← ← ডি [1], 'মেরেছে!'

(সম্পাদনা: অন্তত সাংখ্যিক GOTOs ব্যবহৃত লাইন লেবেলের পরিবর্তে দেখা যাচ্ছে যে বাইরে (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 থেকে আসা ছবিগুলি যা অনানুষ্ঠানিক গুগল-চিত্রগুলি API।

সুপার অ্যাকশন ডেমো

পদক্ষেপে যুদ্ধ সিমুলেটর

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 9999হাহা: ডি
ডোরকনব

@ ডুরকনব, অতিরিক্ত বোনাস হিসাবে, আপনি এটির মতো নম্বর দিতে পারেন 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) থেকে ইনপুটটি পড়া ভাল ?

আইডিয়ন রান


হ্যাঁ, ঠিক আছে।
ডুরকনব

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

@ সি 5 এইচ হুম, এটি অদ্ভুত। এটা আমার জন্য কাজ করে.
ডুরকনব

সবেমাত্র এটি ফায়ারফক্স, সাফারি এবং ক্রোমে পরীক্ষা করেছে, ফায়ারফক্সে এটি কাজ করে =) ক্রোম আমাকে উপরে দেয় এবং
সাফারিকে

@ সি 5 এইচ :( সম্ভবত আমি এটিকে প্রতিস্থাপন করতে পারলাম alertতবে এটি খুব বিরক্তিকর হবে: পি
ডোরকনব

: পি হ্যাঁ এটি প্রকৃতপক্ষে বিরক্তিকর হবে তবে অন্তত এটি "6" অক্ষরগুলি সংরক্ষণ করবে এবং
টাইপ এয়ারার

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

javascript: 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 অক্ষর, আমি "!" মিস করেছি "ডজস" এর পরে
ওহ এবং আমি "নমুনা আউটপুট" পরে
জাভাস্ক্রিপ্টে শিরোনামটি পরিবর্তন করে আসার পরে একটি আউটপুট দিতে ভুলে গেছি , যেমন @ টোবডেটের পরামর্শ অনুসারে


লোককে বিভ্রান্ত করতে এড়ানোর জন্য আপনি কেন এটি জাভাস্ক্রিপ্ট বলছেন না?
tbodt

@ টিবিডট আমি ভেবে দেখিনি এটি লোককে বিভ্রান্ত করবে =) পরিবর্তে এটি জাভাস্ক্রিপ্টে পরিবর্তিত হয়েছে
C5H8NNaO4

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

সি # - 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])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.