Física golfe: tiro inclinado

9

"E agora para algo completamente diferente."

Um pássaro zangado é atingido em um ângulo β em relação à horizontal na velocidade u. O chão é íngreme, inclinado em um ângulo α. Encontre a distância horizontal q que o pássaro viajou antes de atingir o chão.

Tiroteio

Faça uma função f (α, β, u) que retorne o comprimento q : a distância horizontal que o pássaro viajou antes de atingir o chão.

Restrições e notas:

  • -90 <α <90.
  • 0 <β <180.
  • α é sempre menor que β.
  • 0 <= u <10 ^ 9.
  • Assuma a aceleração devido à gravidade g = 10.
  • Você pode usar radianos em vez de graus para α, β.
  • As dimensões de u são irrelevantes desde que sejam consistentes com g e q.
  • Sem resistência do ar ou qualquer coisa muito chique.

O menor código vence.

Veja o artigo da wikipedia sobre movimento de projéteis para algumas equações.

Amostras:

f(0, 45, 10) = 10
f(0, 90, 100) = 0
f(26.565, 45, 10) = 5
f(26.565, 135, 10) = 15
Eelvex
fonte
Como eu vi alguma confusão sobre a fórmula, aqui está para que outros possam usá-lo:q = ABS[1/5 u^2 Cos[β] Sec[α] Sin[β - α]]
Dr. belisarius

Respostas:

3

Java

Funciona apenas para radianos

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))))));
      }

Versão Golfed (Graças a Peter)

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

Matemática usada:

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
fonte
Há algo errado com isso ... Eu simplesmente não consigo descobrir corretamente, alguém pode ajudar?
Aman ZeeK Verma
Esta fórmula não está correta. Veja o comentário na publicação de
gnibbler
Então, ainda, que não têm qualquer solução perfeita :)
Aman Verma Zeek
11
atualizados a fórmula ... de incêndio alguns casos de teste Agora, por favor
Aman Verma Zeek
Você pode salvar alguns caracteres - Math.abs é desnecessário, -x + y é menor que yx, * 0,2 é menor que / 5 e você possui colchetes desnecessários. OTOH, você está perdendo o tipo de retorno do método.
Peter Taylor
2

Haskell ( 37 35)

Baseado na solução da Aman:

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

Penso que este problema não é um código de golfe real, pois implementa mais uma fórmula do que realmente faz algum algoritmo.

FUZxxl
fonte
Talvez você esteja certo, pois a fórmula já é muito curta.
Eelvex
11
Algo como /5ou /5.funcionaria?
Nabb
Esta fórmula não está correta. Por favor, veja o comentário na publicação do gnibbler.
Eelvex 13/02/11
2

Python3 - 65 caracteres

from math import*
f=lambda α,β,u:(tan(α)+tan(β))*u*u*.2*cos(β)**2
mordedor
fonte
Isso não está correto. 1) f deve sempre ser positivo e 2) para α> 0 retorna um valor maior que para a = 0, o que não é possível.
Eelvex 13/02/11
Ah, bem, eu copiei a fórmula do FUZxxl: /
gnibbler