Navigation en avion

10

Vous êtes chargé de planifier un itinéraire de vol pour une société de livraison d'avion locale. Vous devez acheminer un avion du point A au point B. Vous ne pouvez tout simplement pas commencer en A, pointer l'avion en B et continuer, car les vents dominants vous feront dévier de votre cap. Au lieu de cela, vous devez déterminer dans quelle direction vous devez pointer l'avion afin qu'il vole directement vers B, en tenant compte du vent.

contribution

7 nombres à virgule flottante, codant A_x, A_y, B_x, B_y, S, W_x, W_y. Ce sont les coordonnées de votre départ et de destination, la vitesse de votre avion, et la force du vent le long des axes x et y (la direction du vent pour , non pas).

production

Vous devez imprimer l'angle en degrés (tournant dans le sens antihoraire à partir de l'axe x positif) que le plan doit pointer pour atteindre B en ligne droite. Imprimez GROUNDEDsi le vent est assez fort pour rendre le voyage impossible.

Vous pouvez arrondir au degré le plus proche et le faire avec n'importe quelle méthode que vous souhaitez (haut / bas / plus proche / ...).

exemples

contributions

0 0 10 0 100 0 -50
0 0 10 0 50 -55 0
3.3 9.1 -2.7 1.1 95.0 8.8 1.7

les sorties

30
GROUNDED
229

Le code le plus court gagne.

Keith Randall
la source
1
terre plate? ou petit réservoir de carburant :-)
pmg
5
Attendez ... la terre n'est pas plate?
Keith Randall
1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Génial.
Oleh Prypin
@BlaXpirit: Et si les deux vecteurs sont dans des directions opposées?
Lowjacker
@BlaXpirit: Recherchez a sin x + b cos x = csur Google des méthodes pour résoudre votre équation. La résolution directe n'est peut-être pas la meilleure façon d'aller ici, cependant ...
Keith Randall

Réponses:

1

J - 155 caractères

h=:3 :0
'c w s'=.(([:j./[:-~/2 2$4{.]),([:j./5 6{]),4{])0".y
'T X'=.+.w*+c%|c
C=.-_1 o.X%s
>((s>|w)*.(-T)<s*2 o.C){'GROUNDED';360|<.360+(C+{:*.c)*180%o.1
)

Par exemple:

   h '0 0 10 0 100 0 -50'
30
   h '0 0 10 0 50 -55 0'
GROUNDED
   h '3.3 9.1 -2.7 1.1 95.0 8.8 1.7'
229

Supprimez le 0".début de ysi vous ne vous occupez pas de la syntaxe numérique J ( _pour la négation unaire):

   h 0 0 10 0 100 0 _50
30

Comme je l'ai mentionné dans ma réponse Perl, j'apprends seulement J, mais j'aime sa puissance.

DCharness
la source
2

Perl - 222 caractères

use Math::Trig;($A,$a,$B,$b,$s,$W,$w)=split' ',<>;$c=atan2($b-$a,$B-$A);$A=atan2($w,$W);$S=sqrt($W*$W+$w*$w);$X=$S*sin($A-$c);$T=$S*cos($A-$c);$C=asin($X/$s);print((-$T>$s*cos($C))?"GROUNDED":(360+rad2deg($c-$C))%360,"\n")

Algorithme Straighforward, et vraiment seulement joué au golf en serrant les espaces et la longueur de nom variable, mais je pensais que nous avions besoin d'une première réponse ici. J'ai appris du J pour jouer au golf; Je soupçonne que la simple traduction en J (ou Ruby) l'emportera facilement. En route pour les essayer.

$X= composante vent de travers, $T= composante vent arrière. Nous sommes immobilisés si le vent arrière est en fait un vent de face (c'est-à-dire négatif) et plus fort que notre vitesse anémométrique. Sinon, $Cc'est l'angle de correction du vent que nous soustrayons de notre cap $cpour obtenir notre cap. Nous devons tourner suffisamment loin pour équilibrer le vent de travers avec la composante transversale de notre vitesse.

DCharness
la source
0

Perl: 193

Certes, il s'agit (principalement) du code Perl de DCharness: mais qui n'aime pas la source d'auto-réécriture?

use Math::Trig;$/=' ';@i=<>;$_='1=atan2(3-1,2-0);0=atan2(6,5);2=sqrt(6*6+5*5);5=2*sin(0-1);3=2*cos(0-1);6=asin(5/4);print-3>4*cos 6?GROUNDED:int rad2deg(1-6),"\n"';s/((?<!\w)\d)/\$i[$1]/g;eval

Il produira également des degrés hors spécifications (c'est-à-dire <0 ou> 360), mais ai-je mentionné la source d'auto-réécriture?

Joel Berger
la source