বব বোমান!


13

বব দ্য বোম্যান

      o         
    /( )\                                         This is Bob. 
     L L                                          Bob wants to be an archer.
#############

    .
   / \          <--- bow                          So he bought himself a
  (c -)->       <--- arrow                        nice longbow and is about
  ( )/          <--- highly focused Bob           shoot at a target.
  L L           
#############

___________________________________________________________________________________________
sky

                     Bob is a smart guy. He already knows what angle and
                     velocity his arrow has / will have. But only YOU know
                     the distance to the target, so Bob doesn't know if he
                     will hit or miss. This is where you have to help him.

     .                                                                                  +-+
    / \                                                                                 | |
   (c -)->                                                                              | |
   ( )/                                                                                 +++
   L L                                                                                   |
###########################################################################################

কার্য

আপনার কাজ হ'ল ববকে আঘাত করা বা নিখোঁজ হওয়ার একটি ASCII আর্ট ছবি রেন্ডার করা। গণনার জন্য:

  • আপনার প্রোগ্রামটি আপনার যে arrow_x,angle,velocity,distanceকোনও ক্রমে কমা-বিযুক্ত ইনপুট হিসাবে গ্রহণ করবে input
  • একটি ASCII অক্ষর সমান 1m
  • শেষ লাইনের প্রথম অক্ষরের স্থানাঙ্ক রয়েছে (0,0), সুতরাং স্থলটি (হিসাবে দেওয়া হয়েছে #) এখানে রয়েছে y=0
  • বব সবসময় মাটিতে দাঁড়িয়ে থাকে, তার yঅবস্থান পরিবর্তন হয় না।
  • কোন সর্বাধিক নেই y। যাইহোক, তীর শীর্ষগুলি উপস্থাপিত ছবির মধ্যে মাপসই করা উচিত।
  • সমস্ত ইনপুট দশমিক পূর্ণসংখ্যা হিসাবে সরবরাহ করা হয়।
  • গণনার সময়, ধরুন তীরটি একটি বিন্দু।
  • তীরের উত্স হ'ল >একটি শ্যুটিং ববের তীর মাথা (উপরে দেখুন)। দেওয়া হয়েছে arrow_x, আপনি গণনা করতে হবে arrow_y। আউটপুটে বব এর বাম পায়ের সাথে xকর্ডের সাথে মিল রাখতে হবে । শুটিং বব এর।
  • distanceহয় xলক্ষ্য এর তুল্য পা । (অর্থাত্ টার্গেটের মাঝখানে)।
  • সমস্ত পরিমাপ যথাক্রমে মিটার এবং ডিগ্রীতে সরবরাহ করা হয়।
  • মনোযোগ: শুটিং বব কখনই রেন্ডার হয় না, কেবল গণনার জন্য ব্যবহৃত হয়! দুটি বৈধ আউটপুট-ববসের জন্য নীচে দেখুন
  • লক্ষ্যকে আঘাত করা মানে তীরের পথটি দুটি বাম দিকে লক্ষ্য প্রাচীরের একটিকে অতিক্রম করে ( |) (এটি হয় (দূরত্ব-1,3) বা (দূরত্ব-1,4) some যদি কোনও স্থানে তীরটি 2 মিটারের মধ্যে থাকে তবে স্থানটি দেয়ালের পরিবর্তে এক্সটি এটি আঘাত করে। লক্ষ্য সর্বদা একই উচ্চতা এবং কেবলমাত্র এর এক্স অবস্থান পরিবর্তন করতে পারে))। কর্নার হিট বা লক্ষ্যভেদে আকাশ থেকে পড়ে যাওয়া একটি তীর গণনা করে না।
  • মানক পৃথিবী জি প্রয়োগ হয় (9.81 মি / সেকেন্ড ^ 2)।
  • distance+1 ক্ষেত্রের শেষ, তারপরে, সমস্ত কিছু মিস এবং কোনও তীর রেন্ডার করা উচিত নয়।
  • যদি তীরটি অন্য কোনও উপায়ে লক্ষ্য করে ( distance-1ইত্যাদি), কোনও তীর রেন্ডার করা উচিত নয়।

হারানো

এটি বব অনুপস্থিতির একটি উদাহরণ রেন্ডারিং (তীরটি 34 মিটারের মাটিতে প্রবেশ করে, কোণ 45 ° °, বায়ুতে সময় 10 সে, বেগ 50 ডলার - তবে এই আউটপুট তৈরি করার জন্য আরও অনেক বেশি সম্ভাব্য ইনপুট রয়েছে। কেবল আপনার প্রোগ্রামটি দেখান যে শারীরিকভাবে "নির্ভুল" ফলাফল গণনা করার জন্য সাধারণ সূত্রগুলি)):

                                                                                        +-+
                                                                                        | |
  c\                                                                                    | |
/( )                              v                                                     +++
 L L                              |                                                      |
###########################################################################################

হিট

এটি বব স্কোরিংয়ের একটি উদাহরণ রেন্ডারিং (তীর লক্ষ্যমাত্রায় প্রবেশ করে (= তার পথ অতিক্রম করে)):

                                                                                        +-+
                                                                                     >--X |
 \c/                                                                                    | |
 ( )                                                                                    +++
 L L                                                                                     |
###########################################################################################

উদাহরণ

  • arrow_x7. হয় arrow_yসবসময় 3।
  • angleহয় 30°বা 0.523598776রেডিয়ান
  • velocityহয় 13m/s
  • distance 20 হয়।

সুতরাং লক্ষ্য আঘাত করতে, তীরটি অতিক্রম করতে হবে (19,3)বা (19,4)। অন্য সব কিছু মিস হবে। এই ক্ষেত্রে, তীর স্থল (মানে প্রবেশ করবে yহবে <1.0কোণে) 12.9358m = ~13mপর 1.149s


সীমাবদ্ধতা এবং স্কোরিং

  • এটি , তাই সংক্ষিপ্ততম সমাধানটি জয়লাভ করে। কোন বোনাস আছে।
  • আপনার প্রোগ্রামটি (যেমন কার্যক্ষম নয় ) অবশ্যই উপরে বর্ণিত ফর্ম্যাটে ইনপুট গ্রহণ করতে হবে, অতিরিক্ত ইনপুট অনুমোদিত নয়।
  • আপনাকে ভুল / অর্থহীন / অসম্ভব ইনপুটগুলি পরিচালনা করতে হবে না।
  • আপনার ভাষার জন্য সবচেয়ে সংক্ষিপ্ত যুক্তিসঙ্গত আউটপুট যাই হোক না কেন তা মুদ্রণ করুন (স্ট্যান্ড, ফাইল, ...)।
  • আমি হোয়াইটস্পেস অনুসরণের বিষয়ে চিন্তা করি না।
  • টিপ: আউটপুট প্রস্থ হয় distance+2। উচ্চতা হয় apex+1

5
আপনি কি প্রদত্ত আউটপুট উত্পন্ন করতে ব্যবহৃত ইনপুট যুক্ত করতে পারেন?
ব্লু

3
আপনি কেন একটি ফাংশন পোস্ট করতে পারবেন না?
লুভজো

2
@ এমএইচএমডি আপনাকে টানতে হবে, যেমন টাস্কে বলা হয়েছে। The left foot of Bob in the output has to match the x coord. of the shooting Bob.এবংSee below for the two valid output-Bobs
mınxomaτ

1
এবং আমাদের মধ্যে যারা GCSE এর চেয়ে বেশি পদার্থবিজ্ঞান
ব্লু

2
@ মুদ্দিফিশ ট্র্যাজেক্টরি সমীকরণের জন্য গুগল করুন।
mınxomaτ

উত্তর:


2

রুবি, 482

include Math
def f s,e,l
[s,' '*(l-s.size-e.size),e].join
end
alias p puts
X,o,V,d=$*[0].split(?,).map &:to_i
o*=PI/180
L=X+d
B='| |'
S=''
G=' L L'
p f S,'+-+',L
d.times{|x|y=3+x*tan(o)-(9.81*x**2)/(2*(V*cos(o))**2)
if x==d-1&&(3..5)===y
s='>--X |'
m=(3..4)===y
p f S,m ?B: s,L
p f ' \c/',m ?s: B,L
p f ' ( )',?+*3,L
p f G,'| ',L
elsif y<=1 || x==d-1
p f S,B,L
p f '  c\\',B,L
print f '/( )', y<1? 'V':' ',x
p f S,?+*3,L-x
print f G, y<1? '|':' ',x
p f S,'| ',L-x
break
end}
p ?#*L

Ungolfed

include Math
def fill s,e,l
   [s,' '*(l-s.size-e.size),e].join
end
arrow_x,angle,velocity,distance = $*[0].split(',').map(&:to_i)
angle *= PI/180
length=arrow_x+distance
loss = '| |'
puts fill '','+-+',length
distance.times { |x|
  y = 3 + x*tan(angle) - (9.81*x**2)/(2*(velocity*cos(angle))**2)
  if x == distance-1 && (3..5)===y
    puts fill '',(3..4)===y ? '| |':'>--X |',length
    puts fill ' \c/',(3..4)===y ? '>--X |':'| |',length
    puts fill ' ( )','+++',length
    puts fill ' L L','| ',length
  elsif y<=1 || x==distance-1
    puts fill '',loss,length
    puts fill '  c\\',loss,length
    print fill '/( )', y<1? 'v': ' ', x
    puts fill '','+++',length-x
    print fill ' L L', y<1? '|': ' ', x
    puts fill '',' | ',length-x
    break
  end
}
puts ?#*length

পদ্ধতি

এখানে মূল সমীকরণটি হ'ল:

ট্রাজেক্টরি সমীকরণ

দ্রষ্টব্য: চিত্র https://en.wikedia.org/wiki/Trajectory_of_a_projectil থেকে তোলা

কোথায়,

y0: initial height (of arrow)  
Ө: the angle  
x: the position of the arrow  
g: gravity (9.81)
v: velocity

আমি যা করছি তা হচ্ছে 0 থেকে (দূরত্ব -1) পর্যন্ত সংখ্যার মধ্য দিয়ে লুপ করা এবং প্রতিটি পুনরাবৃত্তিতে পরীক্ষা করে দেখুন তীরটি মাটিতে (বা লক্ষ্য) আঘাত করে কিনা?

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