Физика гольфа: наклонная стрельба

9

"А сейчас нечто соверешнно другое."

Сердитый птица снимается под углом р к горизонтали со скоростью и. Земля крутая, наклонена под углом α. Найдите горизонтальное расстояние q, которое птица прошла до того, как упала на землю.

стрельба

Сделайте функцию f (α, β, u), которая возвращает длину q : горизонтальное расстояние, пройденное птицей до того, как она упала на землю.

Ограничения и примечания:

  • -90 <α <90.
  • 0 <β <180.
  • α всегда меньше, чем β.
  • 0 <= u <10 ^ 9.
  • Предположим, ускорение под действием силы тяжести g = 10.
  • Вы можете использовать радианы вместо градусов для α, β.
  • Размеры u не имеют значения, если они соответствуют g и q.
  • Нет сопротивления воздуха или чего-то слишком необычного.

Самый короткий код выигрывает.

Смотрите статью в википедии о движении снаряда для некоторых уравнений.

Образцы:

f(0, 45, 10) = 10
f(0, 90, 100) = 0
f(26.565, 45, 10) = 5
f(26.565, 135, 10) = 15
Eelvex
источник
Поскольку я увидел некоторую путаницу в отношении формулы, здесь ее могут использовать другие:q = ABS[1/5 u^2 Cos[β] Sec[α] Sin[β - α]]
Доктор Белизарий,

Ответы:

3

Ява

Работает только для радианов

double q(double a, double b, double u){
          return (Math.abs(((-Math.tan(a)+(Math.tan(b)))*(u*u)*(0.2*(Math.cos(b)*Math.cos(b))))));
      }

Версия для гольфа (спасибо Питеру)

double z=u*Math.cos(b);return(Math.tan(b)-Math.tan(a))*z*z/5;

Математика используется:

q=u Cos(B) t
q tan(A) = u sin (B) t - .5 * 10 * t^2

- tan (A)  + tan(B) = 5q/u^2 sec^2 (B)
q =  [ - tan(A) + tan (B) ] u^2
    ---------------------
    sec^2(B)*5
Аман ЗееК Верма
источник
Что-то не так с этим ... Я просто не могу понять, может ли кто-нибудь1 помочь?
Aman ZeeK Verma
Эта формула не верна. Пожалуйста, смотрите комментарий в сообщении gnibbler
Eelvex
Так что пока у нас нет идеального решения :)
Aman ZeeK Verma
1
обновил формулу ... теперь запустите несколько
тестов
Вы можете сохранить несколько символов - Math.abs не нужен, -x + y короче как yx, * 0.2 короче как / 5, и у вас есть лишние скобки. OTOH вы пропускаете тип возврата метода.
Питер Тейлор
2

Хаскелл ( 37 35)

На основании решения Амана:

q a b u=(tan a+tan b)*u*u*cos b^2/5

Я думаю, что эта проблема не настоящая игра в код, потому что она скорее реализует формулу, чем на самом деле выполняет какой-то алгоритм.

FUZxxl
источник
Может быть, вы правы, так как формула уже слишком коротка.
двенадцать
1
Будет ли что-то вроде /5или /5.работа?
Набб
Эта формула не верна. Пожалуйста, смотрите комментарий на пост gnibbler.
Eelvex
2

Python3 - 65 символов

from math import*
f=lambda α,β,u:(tan(α)+tan(β))*u*u*.2*cos(β)**2
gnibbler
источник
Это не совсем правильно. 1) f всегда должно быть положительным и 2) при α> 0 он возвращает большее значение, чем при a = 0, что невозможно.
Eelvex
Ах, хорошо, я скопировал формулу FUZxxl: /
gnibbler