Nawigacja samolotowa

10

Twoim zadaniem jest zaplanowanie trasy przelotu dla lokalnej firmy dostarczającej samoloty. Musisz poprowadzić samolot z punktu A do punktu B. Po prostu nie możesz wystartować w punkcie A, skierować samolot w stronę B i lecieć, ponieważ panujące wiatry zdmuchną cię z kursu. Zamiast tego musisz dowiedzieć się, w którym kierunku powinieneś wycelować samolot, aby leciał bezpośrednio do B, biorąc pod uwagę wiatr.

Wejście

7 liczb zmiennoprzecinkowych, kodujących A_x, A_y, B_x, B_y, S, W_x, W_y. Są to współrzędne punktu początkowego i docelowego, prędkość lotu swojego samolotu, a siła wiatru wzdłuż osi X i Y (kierunek wiatr wieje na nie z).

wynik

Powinieneś wydrukować kąt w stopniach (obracając się przeciwnie do ruchu wskazówek zegara od dodatniej osi x), który płaszczyzna powinna wskazywać, aby osiągnąć B w linii prostej. Wydrukuj, GROUNDEDjeśli wiatr jest tak silny, że uniemożliwi podróż.

Możesz zaokrąglać do najbliższego stopnia i robić to dowolną metodą (góra / dół / najbliższy / ...).

przykłady

wejścia

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

wyjścia

30
GROUNDED
229

Najkrótszy kod wygrywa.

Keith Randall
źródło
1
płaska ziemia? lub mały zbiornik paliwa :-)
pmg
5
Zaraz ... Ziemia nie jest płaska?
Keith Randall
1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Świetnie.
Oleh Prypin
@BlaXpirit: Co zrobić, jeśli dwa wektory są w przeciwnych kierunkach?
Lowjacker
@BlaXpirit: Wyszukaj a sin x + b cos x = cw Google kilka metod rozwiązywania twojego równania. Bezpośrednie rozwiązywanie może jednak nie być najlepszym sposobem na przejście tutaj ...
Keith Randall

Odpowiedzi:

1

J - 155 znaków

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
)

Na przykład:

   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

Usunąć 0". wyprzedzenie, yjeśli nie masz nic przeciwko składni numerycznej J ( _dla jednoargumentowej negacji):

   h 0 0 10 0 100 0 _50
30

Jak wspomniałem w mojej odpowiedzi na Perla, uczę się tylko J, ale lubię jego moc.

DCharness
źródło
2

Perl - 222 znaki

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

Prosty algorytm i tak naprawdę grał w golfa tylko przez ściśnięcie białych znaków i zmiennej długości nazwy, ale myślałem, że potrzebujemy tutaj pierwszej odpowiedzi. Nauczyłem się trochę gry w golfa; Podejrzewam, że zwykłe tłumaczenie na J (lub Ruby) łatwo to pokona. Off, aby spróbować.

$X= komponent bocznego wiatru, $T= komponent bocznego wiatru. Jesteśmy uziemieni, jeśli wiatr tylny jest rzeczywiście wiatrem przeciwnym (tj. Ujemnym) i silniejszy niż nasza prędkość. W przeciwnym razie $Cjest to kąt korekcji wiatru, który odejmujemy od kursu, $caby uzyskać właściwy kurs . Musimy skręcić wystarczająco daleko, aby zrównoważyć wiatr boczny z składową poprzeczną naszej prędkości.

DCharness
źródło
0

Perl: 193

Trzeba przyznać, że jest to (przeważnie) kod Perla DCharness: ale kto nie lubi źródła samemu przepisującego?

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

Wyprowadzi również stopnie poza specyfikacją (tj. <0 lub> 360), ale czy wspomniałem o źródle do przepisywania?

Joel Berger
źródło