Самолетная навигация


10

Вам поручено планирование маршрута полета для местной компании по доставке самолетов. Вам нужно направить самолет из пункта А в пункт Б. Однако вы просто не можете начать с А, навести самолет на В и, тем не менее, уйти, так как преобладающие ветры унесут вас с курса. Вместо этого вам нужно выяснить, в каком направлении вам следует направить самолет, чтобы он летел прямо к B, принимая во внимание ветер.

вход

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 = cGoogle некоторые методы решения вашего уравнения. Прямое решение, возможно, не лучший способ пойти сюда, хотя ...
Кит Рэндалл

Ответы:


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

По общему признанию это - (главным образом) код Perh 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.