Фізичний гольф: похила стрільба


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

Оскільки я побачив певну плутанину щодо формули, ось для q = ABS[1/5 u^2 Cos[β] Sec[α] Sin[β - α]]
кого

Відповіді:


3

Java

Працює лише для радіанів

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

У цьому щось не так ... Я просто не можу правильно зрозуміти, чи може хтось допомогти?
Aman ZeeK Verma

Ця формула не є правильною. Будь ласка, дивіться коментар у дописі gnibbler
Eelvex

Отже, у нас немає ідеального рішення :)
Aman ZeeK Verma

1
оновив формулу ... запустити кілька тестів зараз, будь ласка
Aman ZeeK Verma

Ви можете зберегти кілька символів - 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

Я думаю, що ця проблема не є справжнім кодом-гольфом, оскільки це більше реалізація формули, ніж дійсно виконання якогось алгоритму.


Можливо, ви праві, оскільки формула вже занадто коротка.
Енайсекс

1
Було б щось на кшталт /5або /5.працює?
Nabb

Ця формула не є правильною. Будь ласка, дивіться коментар у публікації гніблера.
Енайсекс

2

Python3 - 65 символів

from math import*
f=lambda α,β,u:(tan(α)+tan(β))*u*u*.2*cos(β)**2

Це не зовсім правильно. 1) f завжди має бути позитивним; 2) для α> 0 він повертає більше значення, ніж для a = 0, що неможливо.
Енайсекс

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