ボブ・ザ・ボーマン!


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アート画像をレンダリングすることです。計算の場合:

  • プログラムはarrow_x,angle,velocity,distance、コンマ区切りの入力として任意の順序で受信します。
  • 1つのASCII文字が等しい1m
  • 最後の行の最初の文字には座標(0,0)があるため、地面(としてレンダリングされる#)はにありy=0ます。
  • ボブは常に地面に立ち、彼のy位置は変わりません。
  • 最大値はありませんy。ただし、矢印の頂点はレンダリングされた画像内に収まる必要があります。
  • すべての入力は10進整数として提供されます。
  • 計算中に、矢印が点であると仮定します。
  • 矢印の原点は、>射撃ボブの矢じりです(上記参照)。したがってarrow_x、計算する必要がありますarrow_y。出力のボブの左足はx座標と一致する必要があります。射撃ボブの。
  • distanceあるx対象者の座標。(つまり、ターゲットの中央)。
  • すべての測定値は、それぞれメートルと度で提供されます。
  • 注意:射撃ボブは決してレンダリングされず、計算にのみ使用されます!2つの有効な出力ボブについては、以下を参照してください
  • ターゲットを押すと、矢印のパスが左端の2つのターゲット壁(|)のいずれか((distance-1,3)または(distance-1,4)のいずれかと交差することを意味します。ヒットする壁の代わりにX。ターゲットは常に同じ高さで、そのx位置のみが変更できます。コーナーヒットまたは空からターゲットに落ちる矢印はカウントされません。
  • 標準アースgが適用されます(9.81 m / s ^ 2)。
  • distance+1 フィールドの終わりです。その後、すべてが失敗し、矢印はレンダリングされません。
  • 他の方法(distance-1など)で矢印がターゲットに当たった場合、矢印はレンダリングされません。

お嬢

これはボブの行方不明のレンダリングの例です(矢印は34mで地面に入り、角度は45°、空中時間は10秒、速度は〜50です-しかし、この出力を引き起こす可能性のある入力がたくさんあります。物理的に「正確な」結果を計算するための通常の式。):

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

ヒット

これは、ボブのスコアリングの例です(矢印がターゲットに入ります(=パスを横切ります)):

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

  • arrow_xは7 arrow_yです。常に3です。
  • angleis 30°または0.523598776ラジアン。
  • velocityです13m/s
  • distance 20です。

そのため、ターゲットをヒットするには、矢印が(19,3)またはを横切る必要があり(19,4)ます。それ以外はすべて失敗です。この場合、矢印はafterで地面に入ります(手段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よりも物理学を取り入れていない(または忘れただけですか?)
Blue

2
@muddyfish軌道方程式をグーグルで検索してください。
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

非ゴルフ

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.