Navigasi Pesawat

10

Anda ditugasi merencanakan rute penerbangan untuk perusahaan pengiriman pesawat lokal. Anda harus merutekan sebuah pesawat dari titik A ke titik B. Anda tidak bisa mulai dari A, arahkan pesawat ke B, dan pergi, bagaimanapun, karena angin yang berlaku akan membuat Anda keluar jalur. Alih-alih, Anda harus mencari tahu ke arah mana Anda harus mengarahkan pesawat sehingga akan terbang langsung ke B, dengan mempertimbangkan angin.

memasukkan

7 angka floating-point, pengkodean A_x, A_y, B_x, B_y, S, W_x, W_y. Ini adalah koordinat awal dan tujuan, kecepatan udara dari pesawat Anda, dan kekuatan angin di sepanjang x dan y sumbu (arah angin bertiup ke , tidak dari).

keluaran

Anda harus mencetak sudut dalam derajat (berputar berlawanan arah jarum jam dari sumbu x positif) yang harus ditunjukkan pesawat untuk mencapai B dalam garis lurus. Cetak GROUNDEDjika angin begitu kencang sehingga perjalanan menjadi tidak mungkin.

Anda dapat membulatkan ke tingkat terdekat, dan melakukannya dengan metode apa pun yang Anda inginkan (atas / bawah / terdekat / ...).

contoh

input

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

output

30
GROUNDED
229

Kode terpendek menang.

Keith Randall
sumber
1
bumi datar? atau tangki bahan bakar kecil :-)
pmg
5
Tunggu ... bumi tidak rata?
Keith Randall
1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Hebat.
Oleh Prypin
@BlaXpirit: Bagaimana jika kedua vektor berada di arah yang berlawanan?
Lowjacker
@BlaXpirit: Cari a sin x + b cos x = cdi Google untuk beberapa metode penyelesaian persamaan Anda. Pemecahan langsung mungkin bukan cara terbaik untuk pergi ke sini, meskipun ...
Keith Randall

Jawaban:

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
)

Sebagai contoh:

   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

Hapus di 0".depan yjika Anda tidak keberatan dengan sintaks numerik J ( _untuk negasi unary):

   h 0 0 10 0 100 0 _50
30

Seperti yang saya sebutkan dalam jawaban Perl saya, saya hanya belajar J, tetapi menyukai kekuatannya.

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

Algoritma Straighforward, dan benar-benar hanya bermain golf dengan menekan spasi putih dan panjang nama variabel, tapi saya pikir kami membutuhkan jawaban pertama di sini. Saya telah belajar beberapa J untuk bermain golf; Saya menduga hanya menerjemahkan ke J (atau Ruby) akan mudah mengalahkan ini. Pergi untuk mencobanya.

$X= komponen crosswind, $T= komponen penarik. Kita dihukum jika angin penarik sebenarnya angin haluan (yaitu, negatif) dan lebih kuat dari kecepatan udara kita. Kalau tidak, $Cadalah sudut koreksi angin yang kita kurangi dari jalur kita $cuntuk mendapatkan heading kita. Kita harus berbelok cukup jauh untuk menyeimbangkan crosswind dengan komponen lintas-jalur kecepatan kita.

DCharness
sumber
0

Perl: 193

Memang ini (sebagian besar) adalah kode Perl DCharness: tetapi siapa yang tidak suka sumber penulisan ulang sendiri?

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

Juga akan mengeluarkan derajat dari spesifikasi (yaitu <0 atau> 360), tetapi apakah saya menyebutkan sumber penulisan ulang sendiri?

Joel Berger
sumber