Боб Боуман!


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 замість стіни, в яку він потрапляє. Ціль завжди однакової висоти і може змінюватися лише її х положення.). Кутові удари або стріла, що падає з неба на ціль, не враховуються.
  • Застосовується стандартна земля g (9,81 м / с ^ 2).
  • distance+1 це кінець поля, після цього все промах, і жодна стрілка не повинна бути винесена.
  • Якщо стрілка потрапляє в ціль будь-яким іншим способом ( distance-1тощо), жодна стрілка не повинна бути виведена.

Міс

Це приклад відображення Боба відсутнього (стрілка потрапляє в землю на 34м, кут - 45 °, час у повітрі - 10с, швидкість - 50 - але є набагато більше можливих входів, щоб викликати цей вихід. Просто покажіть, що програма використовує звичайні формули для обчислення фізично "точних" результатів.):

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

Удар

Це приклад візуалізації бобових балів (стрілка вводить ціль (= перетинає її шлях)):

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

Приклад

  • arrow_xє 7. arrow_yзавжди 3.
  • angleє 30°або 0.523598776радіани.
  • velocityє 13m/s.
  • distance є 20.

Отже, щоб потрапити в ціль, стрілка повинна перетнути (19,3)або (19,4). Все інше буде промахом. У цьому випадку стрілка увійде в землю (кошти yбудуть <1.0) 12.9358m = ~13mпісля 1.149s.


Обмеження та оцінка

  • Це , тому найкоротше рішення виграє. Бонусів немає.
  • Ваша програма (як і не функціонує ) повинна приймати введення у форматі, описаному вище, додаткове введення заборонено.
  • Вам не доведеться обробляти неправильні / безглузді / неможливі введення.
  • Роздрукуйте на будь-який найкоротший розумний вихід для вашої мови (std, файл, ...).
  • Мене не хвилює пробіл пробілів.
  • Порада: Ширина виводу є 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 Просто google для рівнянь траєкторії.
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) і під час кожної ітерації перевіряти, чи стрілка потрапляє в землю (або в ціль)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.