Okçu Bob!


13

Okçu Bob

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

Görev

Senin görevin, bir ASCII sanat resim Bob hedefe isabet veya eksik yapmaktır. Hesaplama için:

  • Programınız arrow_x,angle,velocity,distanceistediğiniz sırada virgülle ayrılmış girdi olarak alacaktır .
  • Bir ASCII karakteri eşittir 1m.
  • Son satırdaki ilk karakter koordinatlara sahiptir (0,0), bu nedenle zemin (olarak görüntülenir #) olur y=0.
  • Bob her zaman yerde durur, ypozisyonu değişmez.
  • Maks y. Bununla birlikte, tepe okları görüntülenen resme sığmalıdır.
  • Tüm girişler ondalık sayı olarak sağlanır.
  • Hesaplama sırasında, okun bir nokta olduğunu varsayın.
  • Ok orijini, >çekim Bobunun ok başıdır (yukarıya bakınız). Bu nedenle arrow_x, hesaplamak zorundasınız arrow_y. Çıktıdaki Bob'un sol ayağı xkoordinatla eşleşmelidir . çekim Bob.
  • distanceolan xhedefin koordinatı ayak . (yani hedefin ortası).
  • Tüm ölçümler sırasıyla metre ve derece olarak verilir.
  • Dikkat: Atış Bob asla işlenmez, sadece hesaplamalar için kullanılır! İki geçerli çıkış-Bobs için aşağıya bakın
  • Hedefi vurmak ok yolunun en soldaki iki hedef duvardan ( |) (yani (mesafe-1,3) veya (mesafe-1,4)) geçtiği anlamına gelir . Hedef her zaman aynı yükseklikte ve yalnızca x konumu değişebilir.). Köşe vuruşları veya gökten hedefe düşen bir ok sayılmaz.
  • Standart topraklama g uygulanır (9.81 m / s ^ 2).
  • distance+1 alanın sonu, bundan sonra her şey bir özledim ve ok yapılmamalıdır.
  • Ok hedefe başka bir şekilde ( distance-1vb.) Vurursa, ok yapılmamalıdır.

Özlemek

Bu, Bob'un eksik gösterilmesinin bir örneğidir (ok 34m'de yere girer, açı 45 °, havadaki süre 10s, hız ~ 50'dir - ancak bu çıktıya neden olmak için çok daha fazla girdi vardır. Fiziksel olarak "doğru" sonuçları hesaplamak için normal formüller.):

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

hit

Bu, Bob puanlamasının bir gösterimidir (ok hedefe girer (= yolunu keser)):

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

Misal

  • arrow_x7. olduğu arrow_yzaman 3 'tür.
  • angleolduğu 30°veya 0.523598776radyan.
  • velocityolduğunu 13m/s.
  • distance 20'dir.

Yani hedefe ulaşmak için, ok (19,3)veya geçmek gerekir (19,4). Diğer her şey bir özledim olacak. Bu durumda, ok zemin (vasıta girecek yolacak <1.0en) 12.9358m = ~13msonra 1.149s.


Limitler ve Puanlama

  • Bu , bu yüzden en kısa çözüm kazanır. Bonus yok.
  • Kişisel programı (olduğu gibi değil işlevi biçiminde girişini kabul etmek zorundadır) Yukarıda açıklanan ek giriş izin verilmez.
  • Yanlış / anlamsız / imkansız girdileri işlemek zorunda değilsiniz.
  • Diliniz için en kısa makul çıktıya (std, dosya, ...) yazdırın.
  • Sondaki boşlukları önemsemiyorum.
  • İpucu: Çıktı genişliği distance+2. Yükseklik apex+1.

5
Lütfen verilen çıktıyı oluşturmak için kullanılan girdiyi ekleyebilir misiniz?
Blue

3
Neden bir işlev gönderemiyorsunuz?
Loovjo

2
@Mhmd Görevde belirtildiği gibi onu çizmelisiniz. The left foot of Bob in the output has to match the x coord. of the shooting Bob.veSee below for the two valid output-Bobs
minixom

1
Ve GCSE'den daha fazla fizik almayan (veya sadece unuttun mu?)
Mavi

2
@muddyfish Yörünge denklemleri için sadece google.
20x15

Yanıtlar:


2

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

Yöntem

Buradaki ana denklem:

yörünge denklemi

Not: https://en.wikipedia.org/wiki/Trajectory_of_a_projectile adresinden alınan resim

Nerede,

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

Ne yaptığım 0 ile (mesafe -1) sayılar arasında döngü yapmak ve her yineleme kontrolünde okun yere (veya hedefe) çarpıp çarpmadığını kontrol etmek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.