Боб Лучник!


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ввод через запятую в любом порядке.
  • Один символ ASCII равен 1m.
  • Первый символ в последней строке имеет координаты (0,0), поэтому земля (отображается как #) имеет значение y=0.
  • Боб всегда стоит на земле, его yположение не меняется.
  • Там нет макс y. Тем не менее, верхушка стрелок должна вписываться в отображаемое изображение.
  • Все входные данные представлены в виде десятичного целого числа.
  • Во время расчета предположим, что стрелка является точкой.
  • Начало стрелки - стрелка >Боба (см. Выше). Итак, учитывая arrow_x, вы должны рассчитать arrow_y. Левая нога Боба на выходе должна соответствовать xкоординате. стрельбы Боб.
  • distanceэто xкоордината цели стопы . (т. е. середина цели).
  • Все измерения представлены в метрах и градусах соответственно.
  • Внимание: стреляющий Боб никогда не отображается, используется только для расчетов! Смотрите ниже для двух действительных выходных Бобов
  • Попадание в цель означает, что путь стрелок пересекает одну из двух крайних левых стенок цели ( |) (то есть (расстояние-1,3) или (расстояние-1,4). Если в какой-то момент стрелка находится в пределах этих 2 м², поместите X вместо стены, в которую она попадает. Цель всегда имеет одинаковую высоту, и только ее позиция x может измениться.). Угловые удары или стрела, падающая с неба на цель, не учитываются.
  • Применяется стандартное заземление g (9,81 м / с ^ 2).
  • distance+1 это конец поля, после этого все пропущено и стрелка не должна отображаться.
  • Если стрелка попадает в цель любым другим способом ( distance-1и т. Д.), Стрелка не должна отображаться.

скучать

Это пример отрисовки пропавшего Боба (стрелка входит в землю на 34 м, угол 45 °, время в воздухе 10 с, скорость ~ 50 - но есть намного больше возможных входов, чтобы вызвать этот вывод. Просто покажите, что ваша программа использует Обычные формулы для расчета физически «точных» результатов.):

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

Хит

Это пример визуализации оценки Боба (стрелка входит в цель (= пересекает ее путь)):

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

пример

  • arrow_x7. arrow_yвсегда 3.
  • angleэто 30°или 0.523598776радианы.
  • velocityесть 13m/s.
  • distance 20

Таким образом, чтобы поразить цель, стрелка должна пересечь (19,3)или (19,4). Все остальное будет мисс. В этом случае стрелка войдет в землю (значит, yбудет <1.0) 12.9358m = ~13mпосле 1.149s.


Лимиты и подсчет очков

  • Это , поэтому выигрывает самое короткое решение. Там нет бонусов.
  • Ваша программа (как и не функция ) должна принимать ввод в формате, описанном выше, дополнительный ввод не разрешен.
  • Вам не нужно обрабатывать неправильные / бессмысленные / невозможные вводные данные.
  • Выведите на любой кратчайший разумный выход для вашего языка (стандартный, файл, ...).
  • Меня не волнует конечный пробел.
  • Совет: Ширина вывода равна 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
mynxomaτ

1
И для тех из нас, кто не взял физику дальше, чем GCSE (или только что забыл?)
Blue

2
@muddyfish Просто Google для уравнений траектории.
Mynxomaτ

Ответы:


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

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

метод

Основное уравнение здесь:

уравнение траектории

Примечание: изображение взято с 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) и в каждой итерации проверяю, попадает ли стрелка в землю (или цель)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.