Навігація на літаку


10

Вам доручено планувати маршрут польоту для місцевої компанії з доставки літаків. Потрібно прокласти маршрут з точки А до точки В. Ви просто не можете стартувати з А, наводьте літак на В і вирушайте, однак, оскільки переважаючі вітри будуть дути вас з курсу. Натомість вам потрібно розібратися, у якому напрямку ви маєте вказувати літак, щоб він летів прямо до В, враховуючи вітер.

вхід

7 чисел з плаваючою комою, що кодують A_x, A_y, B_x, B_y, S, W_x, W_y. Ці координати вашого старту і призначення, швидкість політ вашого літака, і сила вітрів уздовж осі х і у (напрямок вітер дме з , а не з).

вихід

Ви повинні надрукувати кут у градусах (обертаючись проти годинникової стрілки від позитивної осі x), що площина повинна вказувати, щоб досягти B по прямій лінії. Роздрукуйте, GROUNDEDякщо вітер такий сильний, що унеможливить подорож.

Ви можете заокруглити до найближчого ступеня і зробити це будь-яким способом, який ви хочете (вгору / вниз / найближче / ...).

приклади

входи

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

виходи

30
GROUNDED
229

Найкоротший код виграє.


1
плоска земля? або малий паливний бак :-)
pmg

5
Зачекайте ... земля не рівна?
Кіт Рендалл

1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Чудово.
Олег Припін

@BlaXpirit: Що робити, якщо два вектори знаходяться в протилежних напрямках?
Lowjacker

@BlaXpirit: шукайте a sin x + b cos x = cв Google деякі методи розв’язання рівняння. Пряме вирішення може бути не найкращим способом поїхати сюди, хоча ...
Кіт Рендалл

Відповіді:


1

J - 155 символів

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
)

Наприклад:

   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

Видаліть 0".випередження, yякщо ви не заперечуєте проти числового синтаксису J ( _для унарного заперечення):

   h 0 0 10 0 100 0 _50
30

Як я вже згадував у своїй відповіді на Perl, я лише вивчаю J, але мені подобається його сила.


2

Perl - 222 символи

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

Прямий алгоритм, і насправді лише гольф, видавлюючи пробіл та змінну довжину імені, але я подумав, що нам тут потрібна перша відповідь. Я навчився деякого J для гольфу; Я підозрюю, що просто переклад на J (або Ruby) легко переможе це. Вимкнути, щоб спробувати це.

$X= поперечний компонент, $T= компонент заднього духу. Ми заземлені, якщо задній вітер насправді є вітровим (тобто негативним) і сильнішим за нашу швидкість повітря. В іншому випадку $C- це кут виправлення вітру, який ми віднімаємо від курсу, $cщоб отримати свій заголовок. Нам потрібно повернути досить далеко, щоб врівноважити поперечний вітер з поперечною складовою нашої швидкості.


0

Perl: 193

Справді, це (в основному) код Perl DCharness: але кому не подобається джерело самозапису?

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

Крім того, він буде виводити градуси поза специфікацією (тобто <0 або> 360), але я згадав джерело самозапису?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.