鲍曼鲍勃!


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

任务

您的任务是渲染Bob击中或错过目标的ASCII艺术图片。对于计算:

  • 您的程序将按arrow_x,angle,velocity,distance您希望的任何顺序接收以逗号分隔的输入。
  • 一个ASCII字符等于1m
  • 最后一行的第一个字符具有坐标(0,0),因此地面(渲染为#)位于y=0
  • 鲍勃总是站在地上,他的y位置没有改变。
  • 没有上限y。但是,箭头顶点应适合渲染的图片。
  • 所有输入均以十进制整数形式提供。
  • 在计算过程中,假设箭头是一个点。
  • 箭头原点是>射击鲍勃的箭头(请参见上文)。因此arrow_x,必须计算arrow_y。Bob在输出中的左脚必须与x坐标匹配。射击鲍勃。
  • distancex目标的坐标。(即目标的中间)。
  • 所有测量值分别以米和度为单位。
  • 注意:射击鲍勃从不渲染,仅用于计算!参见下面的两个有效输出-鲍勃
  • 击中目标意味着箭头路径穿过最左边的两个目标墙(|)中的一个(即(距离1.3)或(距离1.4)。如果在某个点上箭头位于2m²之内,则放置X,而不是它碰到的墙。目标始终是相同的高度,只有其x位置可以更改。)角击或从天上掉落到目标上的箭头不算在内。
  • 适用标准接地g(9.81 m / s ^ 2)。
  • distance+1 是该字段的结尾,此后,所有内容都将丢失,并且不应呈现任何箭头。
  • 如果箭头以任何其他方式(distance-1等等)击中目标,则不应渲染任何箭头。

小姐

这是鲍勃失踪的示例渲染(箭头在34m处进入地面,角度为45°,在空气中停留的时间为10s,速度为〜50-但还有很多可能的输入会导致此输出。请仅说明您的程序使用了计算物理“准确”结果的常用公式。):

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

击中

这是Bob得分的示例渲染(箭头进入目标(=越过其路径)):

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

  • arrow_x是7 arrow_y,总是3。
  • angle30°0.523598776弧度。
  • velocity13m/s
  • distance 是20。

因此,为了击中目标,箭头必须穿过(19,3)(19,4)。其他一切都会错过。在这种情况下,箭头将在之后进入地面(表示y<1.0)。12.9358m = ~13m1.149s


限制和计分

  • 这是,因此最短的解决方案是成功的。没有奖金。
  • 您的程序(如not function)必须接受上述格式的输入,不允许其他输入。
  • 您不必处理错误/毫无意义/不可能的输入。
  • 打印到您的语言(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 Blue

2
@muddyfish只是谷歌的轨迹方程。
mınxomaτ

Answers:


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)之间的数字,并在每次迭代中检查箭头是否触地(或目标)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.