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.

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.