บ๊อบโบว์แมน!


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 ของ Bob กดปุ่มหรือพลาดเป้าหมาย สำหรับการคำนวณ:

  • โปรแกรมของคุณจะได้รับarrow_x,angle,velocity,distanceเป็นการป้อนข้อมูลที่คั่นด้วยเครื่องหมายจุลภาคตามลำดับที่คุณต้องการ
  • ตัวละครตัวหนึ่ง ASCII 1mเท่ากับ
  • ตัวอักษรตัวแรกในบรรทัดสุดท้ายมีพิกัด(0,0)เพื่อให้พื้นดิน (กลายเป็น#) y=0เป็นที่
  • บ๊อบยืนอยู่บนพื้นเสมอyตำแหน่งของเขาไม่เปลี่ยนแปลง
  • yไม่มีสูงสุดคือ อย่างไรก็ตามลูกศรยอดควรจะพอดีกับภาพที่แสดง
  • อินพุตทั้งหมดมีให้เป็นจำนวนเต็มทศนิยม
  • ในระหว่างการคำนวณให้ถือว่าลูกศรเป็นจุด
  • ต้นกำเนิดลูกศรคือหัวลูกศร>ของบ๊อบยิง (ดูด้านบน) ให้ดังนั้นคุณจะต้องคำนวณarrow_x arrow_yเท้าซ้ายของ Bob ในผลลัพธ์จะต้องตรงกับxcoord ของบ๊อบยิง
  • distanceเป็นxพิกัดของเป้าหมายเท้า (เช่น. กึ่งกลางของเป้าหมาย)
  • การวัดทั้งหมดจะมีให้ในหน่วยเมตรและองศาตามลำดับ
  • ข้อควรระวัง: บ๊อบยิงไม่เคยแสดงผลใช้สำหรับการคำนวณเท่านั้น! ดูด้านล่างสำหรับสอง output-Bobs ที่ถูกต้อง
  • การกดปุ่มเป้าหมายหมายถึงเส้นทางลูกศรข้ามหนึ่งในกำแพงกำแพงด้านซ้ายสุดของทั้งสอง ( |) (นั่นคือ (ระยะทาง 1,3) หรือ (ระยะทาง -1, 1,4) ถ้า ณ จุดหนึ่งลูกศรอยู่ภายใน 2 ตารางเมตรให้วาง X แทนกำแพงที่ชนเป้าหมายจะมีความสูงเท่ากันเสมอและมีเพียงตำแหน่ง x เท่านั้นที่สามารถเปลี่ยนแปลงได้) การชนมุมหรือลูกศรที่ตกลงมาจากท้องฟ้าไปยังเป้าหมายจะไม่นับรวม
  • ใช้ดินมาตรฐาน g (9.81 m / s ^ 2)
  • distance+1 เป็นจุดสิ้นสุดของฟิลด์หลังจากนั้นทุกอย่างเป็นลูกศรและไม่ควรแสดงลูกศร
  • หากลูกศรพุ่งชนเป้าหมายด้วยวิธีอื่น ( distance-1ฯลฯ ) ไม่ควรแสดงลูกศร

นางสาว

นี่เป็นตัวอย่างการแสดงผลของ Bob ที่หายไป (ลูกศรเข้าสู่พื้นดินที่ 34m, มุม 45 °, เวลาในอากาศคือ 10 วินาที, ความเร็วคือ ~ 50 - แต่มีอินพุตที่เป็นไปได้มากขึ้นที่จะทำให้เกิดผลลัพธ์นี้เพียงแค่แสดงโปรแกรมของคุณ สูตรปกติในการคำนวณผลลัพธ์ "ถูกต้อง" ทางร่างกาย):

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

ตี

นี่คือตัวอย่างการแสดงผลของการให้คะแนนของ Bob (ลูกศรเข้าสู่เป้าหมาย (= ข้ามเส้นทางของมัน)):

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

ตัวอย่าง

  • arrow_xคือ 7 arrow_yคือ 3 เสมอ
  • angleเป็น30°หรือ0.523598776เรเดียน
  • velocity13m/sเป็น
  • distance คือ 20

ดังนั้นเพื่อที่จะเข้าถึงกลุ่มเป้าหมายลูกศรมีการข้ามหรือ(19,3) (19,4)ทุกอย่างอื่นจะพลาด ในกรณีนี้ลูกศรที่จะเข้าสู่พื้นดิน (หมายถึงyจะเป็น<1.0) ที่หลังจาก12.9358m = ~13m1.149s


ขีด จำกัด และเกณฑ์การให้คะแนน

  • นี่คือดังนั้นทางออกที่สั้นที่สุดชนะ ไม่มีโบนัส
  • โปรแกรมของคุณ(ในฐานะที่ไม่ใช่ฟังก์ชั่น ) จะต้องยอมรับอินพุตในรูปแบบที่อธิบายไว้ข้างต้นไม่อนุญาตให้ใช้อินพุตเพิ่มเติม
  • คุณไม่ต้องจัดการกับอินพุตที่ผิด / ไม่มีจุดหมาย / เป็นไปไม่ได้
  • พิมพ์ไปยังสิ่งใดก็ตามที่เป็นผลลัพธ์ที่สั้นที่สุดสำหรับภาษาของคุณ (std, file, ... )
  • ฉันไม่สนใจช่องว่างที่ตามมา
  • เคล็ดลับ:distance+2ความกว้างของการส่งออกเป็น apex+1ความสูง

5
คุณสามารถเพิ่มอินพุตที่ใช้เพื่อสร้างเอาต์พุตที่กำหนดได้ไหม
บลู

3
ทำไมคุณไม่โพสต์ฟังก์ชั่น?
Loovjo

2
@Mhmd คุณต้องวาดเขาตามที่ระบุไว้ในงาน 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
@muddyfish เพียง google สำหรับสมการวิถี
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.wikipedia.org/wiki/Trajectory_of_a_projectile

ที่ไหน

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.