Flugzeugnavigation

10

Sie haben die Aufgabe, eine Flugroute für eine lokale Flugzeuglieferfirma zu planen. Sie müssen ein Flugzeug von Punkt A nach Punkt B routen. Sie können einfach nicht bei A starten, das Flugzeug auf B richten und losfahren, da die vorherrschenden Winde Sie vom Kurs abbringen. Stattdessen müssen Sie herausfinden, in welche Richtung Sie das Flugzeug richten sollten, damit es unter Berücksichtigung des Windes direkt nach B fliegt.

Eingang

7 Gleitkommazahlen, die A_x, A_y, B_x, B_y, S, W_x, W_y codieren. Dies sind die Koordinaten des Start- und Ziel, die Fluggeschwindigkeit des Flugzeugs und der Stärke des Windes entlang der x- und y - Achse (die Richtung der Wind bläst , um nicht aus).

Ausgabe

Sie sollten den Winkel in Grad (gegen den Uhrzeigersinn von der positiven x-Achse drehen) drucken, auf den die Ebene zeigen soll, um B in einer geraden Linie zu erreichen. Drucken Sie, GROUNDEDwenn der Wind so stark ist, dass die Fahrt unmöglich wird.

Sie können auf den nächsten Grad runden und dies mit einer beliebigen Methode tun (nach oben / unten / am nächsten / ...).

Beispiele

Eingänge

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

Ausgänge

30
GROUNDED
229

Der kürzeste Code gewinnt.

Keith Randall
quelle
1
flache Erde? oder kleiner Kraftstofftank :-)
pmg
5
Warten Sie ... die Erde ist nicht flach?
Keith Randall
1
(Xb-Xa) (V · sin & agr; + Wy) = (Yb-Ya) (V · cos & agr; + Wx) ... Großartig.
Oleh Prypin
@BlaXpirit: Was ist, wenn die beiden Vektoren in entgegengesetzte Richtungen weisen?
Lowjacker
@BlaXpirit: Suchen Sie bei a sin x + b cos x = cGoogle nach einigen Methoden zur Lösung Ihrer Gleichung. Direkte Lösung ist jedoch möglicherweise nicht der beste Weg, um hierher zu gelangen ...
Keith Randall

Antworten:

1

J - 155 Zeichen

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
)

Zum Beispiel:

   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

Entfernen Sie das 0".Vorher, ywenn Sie nichts gegen die numerische J-Syntax haben ( _für unäre Negation):

   h 0 0 10 0 100 0 _50
30

Wie ich in meiner Perl-Antwort erwähnt habe, lerne ich nur J, aber ich mag seine Kraft.

DCharness
quelle
2

Perl - 222 Zeichen

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")

Einfacher Algorithmus, der eigentlich nur durch Drücken von Leerzeichen und variabler Namenslänge gespielt wird, aber ich dachte, wir brauchen hier eine erste Antwort. Ich habe etwas J zum Golfen gelernt; Ich vermute, dass eine einfache Übersetzung in J (oder Ruby) dies leicht übertreffen wird. Auf, um diese auszuprobieren.

$X= Seitenwindkomponente, $T= Rückenwindkomponente. Wir sind geerdet, wenn der Rückenwind tatsächlich Gegenwind (dh negativ) und stärker als unsere Fluggeschwindigkeit ist. Ansonsten $Cist der Windkorrekturwinkel, den wir von unserem Kurs abziehen, um unseren Kurs $czu erhalten. Wir müssen weit genug drehen, um den Seitenwind mit der Querstreckenkomponente unserer Geschwindigkeit auszugleichen.

DCharness
quelle
0

Perl: 193

Zugegeben, dies ist (meistens) der Perl-Code von DCharness: aber wer mag es nicht, sich selbst neu zu schreiben?

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

Es werden auch Grad außerhalb der Spezifikation ausgegeben (dh <0 oder> 360), aber habe ich die selbst umschreibende Quelle erwähnt?

Joel Berger
quelle