Uçakta Gezinme


10

Yerel bir uçak dağıtım şirketi için bir uçuş rotası planlamakla görevlisiniz. Bir uçağı A noktasından B noktasına yönlendirmeniz gerekir, ancak A'dan başlayamaz, uçağı B'ye doğrultup gidemezsiniz, ancak hakim rüzgarlar sizi rotadan çıkaracaktır. Bunun yerine, rüzgarı dikkate alarak uçağı doğrudan B'ye uçacak şekilde hangi yöne yönlendirmeniz gerektiğini bulmanız gerekir.

giriş

7 kayan noktalı sayı, kodlama A_x, A_y, B_x, B_y, S, W_x, W_y. Bunlar, başlangıç ve hedef koordinatları, uçağın hava hızı, ve x boyunca rüzgar gücü ve y eksenleri (rüzgar estiğinde yöndür için değil, dan).

çıktı

Düzlemin B düzlemine düz bir çizgide ulaşması için göstermesi gereken açıyı derece cinsinden (pozitif x ekseninden saat yönünün tersine döndürerek) yazdırmalısınız. GROUNDEDRüzgar yolculuğu imkansız kılacak kadar kuvvetli ise yazdırın .

En yakın dereceye yuvarlayabilir ve istediğiniz herhangi bir yöntemle (yukarı / aşağı / en yakın / ...) yapabilirsiniz.

örnekler

girişler

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

çıktılar

30
GROUNDED
229

En kısa kod kazanır.


1
düz dünya? veya küçük yakıt tankı :-)
pmg

5
Bekle ... dünya düz değil mi?
Keith Randall

1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Harika.
Oleh Prypin

@BlaXpirit: Ya iki vektör zıt yönlerde ise?
Lowjacker

@BlaXpirit: a sin x + b cos x = cDenkleminizi çözmenin bazı yöntemlerini Google'da arayın . Doğrudan çözme, buraya gitmek için en iyi yol olmayabilir ...
Keith Randall

Yanıtlar:


1

J - 155 karakter

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
)

Örneğin:

   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

J sayısal sözdizimini dikkate almazsanız 0".ilerisini kaldırın y( _tek taraflı olumsuzlama için):

   h 0 0 10 0 100 0 _50
30

Perl cevabımda bahsettiğim gibi, sadece J öğreniyorum, ama gücünü beğeniyorum.


2

Perl - 222 karakter

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

Doğrudan algoritma ve gerçekten sadece boşluk ve değişken ad uzunluğu sıkarak golf, ama burada ilk cevaba ihtiyacımız olduğunu düşündüm. Golf için J öğreniyorum; Ben sadece J (veya Ruby) çevirmek kolayca yenecek şüpheli. Bunları denemek için kapalı.

$X= çapraz rüzgar bileşeni, $T= kuyruk rüzgar bileşeni. Kuyruk rüzgarı aslında bir kafa rüzgarı (yani, negatif) ve hava hızımızdan daha güçlü ise, topraklandık. Aksi takdirde, $Crotamızı $calmak için parkurumuzdan çıkardığımız rüzgar düzeltme açısıdır . Çapraz rüzgarı hızımızın çapraz yol bileşeniyle dengelemek için yeterince dönmeliyiz.


0

Perl: 193

Kuşkusuz bu (çoğunlukla) DCharness'ın Perl kodu: ama kendini yeniden yazma kaynağını kim sevmez?

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

Ayrıca, spesifikasyonların dışında dereceler de verir (yani <0 veya> 360), ancak kendi kendini yeniden yazma kaynağından bahsetmiş miydim?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.