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

Tugas

Tugas Anda adalah membuat gambar seni ASCII tentang Bob yang mengenai atau melewatkan target. Untuk perhitungan:

  • Program Anda akan menerima arrow_x,angle,velocity,distanceinput yang dipisahkan koma dalam urutan apa pun yang Anda inginkan.
  • Satu karakter ASCII sama dengan 1m.
  • Karakter pertama di baris terakhir memiliki koordinat (0,0), sehingga ground (diterjemahkan sebagai #) berada di y=0.
  • Bob selalu berdiri di tanah, yposisinya tidak berubah.
  • Tidak ada maks y. Namun, puncak panah harus sesuai dengan gambar yang diberikan.
  • Semua input disediakan sebagai bilangan bulat desimal.
  • Selama perhitungan, anggap panah adalah sebuah titik.
  • Asal panah adalah kepala panah >dari Bob yang menembak (lihat di atas). Jadi diberikan arrow_x, Anda harus menghitung arrow_y. Kaki kiri Bob dalam output harus cocok dengan xcoord. penembakan Bob.
  • distanceadalah xkoordinat kaki target . (mis. tengah target).
  • Semua pengukuran disediakan dalam meter dan derajat.
  • Perhatian: Tembakan Bob tidak pernah diberikan, hanya digunakan untuk perhitungan! Lihat di bawah untuk dua keluaran-Bobs yang valid
  • Menekan target berarti jalur panah melintasi salah satu dari dua dinding target paling kiri ( |) (Itu adalah (jarak-1,3) atau (jarak-1,4). Jika pada titik tertentu panah berada di dalam 2m² itu, tempatkan X bukan dinding yang ditabraknya. Targetnya selalu sama tinggi dan hanya posisi x yang bisa berubah.). Hit sudut atau panah yang jatuh dari langit ke target tidak masuk hitungan.
  • Earth standar g berlaku (9,81 m / s ^ 2).
  • distance+1 adalah akhir dari lapangan, setelah itu, semuanya ketinggalan dan tidak ada panah yang harus diberikan.
  • Jika panah mengenai target dengan cara lain ( distance-1dll.), Tidak ada panah yang harus dirender.

Rindu

Ini adalah contoh render dari Bob yang hilang (panah masuk ke tanah pada ketinggian 34m, sudut 45 °, waktu di udara 10 detik, kecepatannya ~ 50 - tetapi ada banyak kemungkinan input yang menyebabkan output ini. Tampilkan saja program Anda menggunakan rumus biasa untuk menghitung hasil fisik "akurat".):

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

Memukul

Ini adalah contoh render penilaian Bob (panah masuk target (= melintasi jalurnya)):

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

Contoh

  • arrow_xadalah 7. arrow_yselalu 3.
  • angleadalah 30°atau 0.523598776radian.
  • velocityadalah 13m/s.
  • distance adalah 20.

Jadi untuk mencapai target, panah harus melewati (19,3)atau (19,4). Segala sesuatu yang lain akan menjadi kehilangan. Dalam hal ini, panah akan masuk ke tanah (berarti yakan <1.0) di 12.9358m = ~13msetelah 1.149s.


Batas & Penilaian

  • Ini adalah , sehingga solusi terpendek menang. Tidak ada bonus.
  • Program Anda (karena tidak berfungsi ) harus menerima input dalam format yang dijelaskan di atas, input tambahan tidak diizinkan.
  • Anda tidak harus menangani input yang salah / tidak berguna / tidak mungkin.
  • Cetak ke apa pun yang merupakan keluaran wajar terpendek untuk bahasa Anda (std, file, ...).
  • Saya tidak peduli tentang tertinggal spasi.
  • Tip: Lebar output adalah distance+2. Tingginya apex+1.
mınxomaτ
sumber
5
Bisakah Anda menambahkan input yang digunakan untuk menghasilkan output yang diberikan?
Biru
3
Mengapa Anda tidak dapat memposting fungsi?
Loovjo
2
@Mhmd Anda harus menggambarnya, seperti yang dinyatakan dalam tugas. The left foot of Bob in the output has to match the x coord. of the shooting Bob.danSee below for the two valid output-Bobs
mınxomaτ
1
Dan bagi kita yang belum mengambil fisika lebih dari GCSE (atau baru saja lupa?)
Biru
2
@muddyfish Hanya google untuk persamaan lintasan.
mınxomaτ

Jawaban:

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

Tidak disatukan

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

metode

Persamaan utama di sini adalah:

persamaan lintasan

Catatan: gambar diambil dari https://en.wikipedia.org/wiki/Trajectory_of_a_projectile

Dimana,

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

Apa yang saya lakukan adalah untuk mengulang angka dari 0 ke (jarak -1) dan di setiap iterasi periksa untuk melihat apakah panah menyentuh tanah (atau target)

Mhmd
sumber