Bob the Bowman!


13

Bob the Bowman

      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                                                                                   |
###########################################################################################

Bài tập

Nhiệm vụ của bạn là đưa ra một bức tranh nghệ thuật ASCII về việc Bob đánh hoặc thiếu mục tiêu. Để tính toán:

  • Chương trình của bạn sẽ nhận được arrow_x,angle,velocity,distancedưới dạng đầu vào được phân tách bằng dấu phẩy theo bất kỳ thứ tự nào bạn muốn.
  • Một ký tự ASCII bằng 1m.
  • Ký tự đầu tiên trong dòng cuối cùng có tọa độ (0,0), vì vậy mặt đất (được hiển thị là #) là tại y=0.
  • Bob luôn đứng trên mặt đất, yvị trí của anh ta không thay đổi.
  • Không có tối đa y. Tuy nhiên, mũi tên đỉnh phải vừa trong hình ảnh được hiển thị.
  • Tất cả đầu vào được cung cấp dưới dạng số nguyên thập phân.
  • Trong quá trình tính toán, giả sử mũi tên là một điểm.
  • Nguồn gốc mũi tên là đầu mũi tên >của Bob bắn (xem bên trên). Vì vậy arrow_x, bạn phải tính toán arrow_y. Chân trái của Bob trong đầu ra phải khớp với xtọa độ. của vụ nổ súng Bob.
  • distancextọa độ của chân mục tiêu . (tức là giữa mục tiêu).
  • Tất cả các phép đo được cung cấp theo mét và độ tương ứng.
  • Chú ý: Việc chụp Bob không bao giờ được kết xuất, chỉ được sử dụng để tính toán! Xem bên dưới cho hai đầu ra hợp lệ - Bobs
  • Đánh trúng mục tiêu có nghĩa là đường mũi tên đi qua một trong hai bức tường mục tiêu ngoài cùng bên trái ( |) (Đó là (khoảng cách-1,3) hoặc (khoảng cách-1,4). Nếu tại một thời điểm nào đó, mũi tên nằm trong khoảng 2m² đó, hãy đặt X thay vì bức tường mà nó chạm vào. Mục tiêu luôn có cùng chiều cao và chỉ vị trí x của nó có thể thay đổi.). Cú đánh góc hoặc một mũi tên từ trên trời rơi xuống mục tiêu không được tính.
  • Tiêu chuẩn g đất được áp dụng (9,81 m / s ^ 2).
  • distance+1 là kết thúc của trường, sau đó, mọi thứ đều bị bỏ lỡ và không có mũi tên nào được hiển thị.
  • Nếu mũi tên chạm vào mục tiêu theo bất kỳ cách nào khác ( distance-1v.v.), không có mũi tên nào được hiển thị.

Đây là một ví dụ về việc Bob bị mất tích (mũi tên rơi xuống đất ở 34m, góc là 45 °, thời gian trong không khí là 10 giây, vận tốc là ~ 50 - nhưng có nhiều đầu vào khả dĩ hơn để gây ra đầu ra này. công thức thông thường để tính kết quả "chính xác" về mặt vật lý.):

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

Đánh

Đây là một ví dụ kết xuất về tính điểm Bob (mũi tên đi vào mục tiêu (= đi qua đường dẫn của nó)):

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

Thí dụ

  • arrow_xlà 7. arrow_yluôn là 3.
  • angle30°hoặc 0.523598776radian.
  • velocity13m/s.
  • distance là 20.

Vì vậy, để bắn trúng mục tiêu, mũi tên phải băng qua (19,3)hoặc (19,4). Mọi thứ khác sẽ là một sự bỏ lỡ. Trong trường hợp này, mũi tên sẽ đi vào mặt đất (có nghĩa y<1.0) 12.9358m = ~13msau 1.149s.


Giới hạn & Ghi điểm

  • Đây là , vì vậy giải pháp ngắn nhất sẽ thắng. Không có tiền thưởng.
  • Chương trình của bạn (như không hoạt động ) phải chấp nhận đầu vào theo định dạng được mô tả ở trên, đầu vào bổ sung không được phép.
  • Bạn không phải xử lý các đầu vào sai / vô nghĩa / không thể.
  • In ra bất cứ thứ gì là đầu ra hợp lý ngắn nhất cho ngôn ngữ của bạn (std, file, ...).
  • Tôi không quan tâm đến khoảng trắng dấu vết.
  • Mẹo: Chiều rộng của đầu ra là distance+2. Chiều cao là apex+1.

5
Bạn có thể thêm đầu vào được sử dụng để tạo đầu ra được cung cấp xin vui lòng?
Màu xanh

3
Tại sao bạn không thể đăng một chức năng?
Loovjo

2
@Mhmd Bạn phải vẽ anh ta, như đã nêu trong nhiệm vụ. 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
Và đối với những người trong chúng ta, những người chưa học vật lý xa hơn GCSE (hoặc đã quên?)
Blue

2
@muddyfish Chỉ cần google cho các phương trình quỹ đạo.
mınxomaτ

Câu trả lời:


2

Ruby, 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

Ung dung

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

phương pháp

Phương trình chính ở đây là:

phương trình quỹ đạo

Lưu ý: hình ảnh được lấy từ https://en.wikipedia.org/wiki/Trajectiony_of_a_projectile

Ở đâu,

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

Những gì tôi đang làm là lặp qua các số từ 0 đến (khoảng cách -1) và trong mỗi lần kiểm tra lặp lại để xem mũi tên có chạm đất (hoặc mục tiêu) không

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.