Golf physique: tir incliné

9

"Et maintenant pour quelque chose de complètement différent."

Un oiseau en colère est abattu selon un angle β par rapport à l'horizontale à une vitesse u. Le sol est raide, incliné d'un angle α. Trouvez la distance horizontale q que l'oiseau a parcourue avant de toucher le sol.

Tournage

Faites une fonction f (α, β, u) qui renvoie la longueur q : la distance horizontale parcourue par l'oiseau avant de toucher le sol.

Contraintes et notes:

  • -90 <α <90.
  • 0 <β <180.
  • α est toujours plus petit que β.
  • 0 <= u <10 ^ 9.
  • Supposons une accélération due à la gravité g = 10.
  • Vous pouvez utiliser des radians au lieu de degrés pour α, β.
  • Les dimensions de u ne sont pas pertinentes tant qu'elles sont cohérentes avec g et q.
  • Aucune résistance à l'air ou quelque chose de trop sophistiqué.

Le code le plus court gagne.

Voir l'article de wikipedia sur le mouvement des projectiles pour quelques équations.

Échantillons:

f(0, 45, 10) = 10
f(0, 90, 100) = 0
f(26.565, 45, 10) = 5
f(26.565, 135, 10) = 15
Eelvex
la source
Comme j'ai vu une certaine confusion au sujet de la formule, ici, c'est à d'autres de l'utiliser:q = ABS[1/5 u^2 Cos[β] Sec[α] Sin[β - α]]
Dr. belisarius

Réponses:

3

Java

Fonctionne uniquement pour les radians

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

Version golfée (Merci à Peter)

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

Maths utilisés:

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
la source
Il y a quelque chose qui ne va pas avec ça ... Je n'arrive pas à comprendre correctement, quelqu'un peut-il aider?
Aman ZeeK Verma
Cette formule n'est pas correcte. S'il vous plaît voir le commentaire au gnibbler poste
Eelvex
Pour l'instant, nous n'avons pas de solution parfaite :)
Aman ZeeK Verma
1
a mis à jour la formule ... lancez quelques tests maintenant s'il vous plaît
Aman ZeeK Verma
Vous pouvez enregistrer quelques caractères - Math.abs n'est pas nécessaire, -x + y est plus court que yx, * 0,2 est plus court que / 5 et vous avez des parenthèses inutiles. OTOH vous manque le type de retour de la méthode.
Peter Taylor
2

Haskell ( 37 35)

Basé sur la solution d'Aman:

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

Je pense que ce problème n'est pas un vrai code-golf, car il s'agit plus d'implémenter une formule que de faire vraiment un algorithme.

FUZxxl
la source
Vous avez peut-être raison, car la formule est déjà trop courte.
Eelvex
1
Est-ce que quelque chose aimerait /5ou /5.fonctionnerait?
Nabb
Cette formule n'est pas correcte. Veuillez voir le commentaire sur le post de gnibbler.
Eelvex
2

Python3 - 65 caractères

from math import*
f=lambda α,β,u:(tan(α)+tan(β))*u*u*.2*cos(β)**2
grignoteur
la source
Ce n'est pas tout à fait correct. 1) f doit toujours être positif et 2) pour α> 0, il renvoie une valeur plus grande que pour a = 0, ce qui n'est pas possible.
Eelvex
Eh bien, j'ai copié la formule de FUZxxl: /
gnibbler