Navegação de Avião

10

Você está encarregado de planejar uma rota aérea para uma empresa de entrega de aviões local. Você precisa direcionar um avião do ponto A ao ponto B. Você simplesmente não pode começar em A, apontar o avião para B e, no entanto, seguir em frente, pois os ventos predominantes o afastarão do curso. Em vez disso, você precisa descobrir em qual direção deve apontar o avião para que ele voe diretamente para B, levando em consideração o vento.

entrada

7 números de ponto flutuante, codificando A_x, A_y, B_x, B_y, S, W_x, W_y. Estas são as coordenadas da sua partida e destino, a velocidade do seu avião, e a força do vento ao longo do eixos xey (a direção o vento sopra a , não a partir de).

resultado

Você deve imprimir o ângulo em graus (girando no sentido anti-horário a partir do eixo x positivo) que o plano deve apontar para alcançar B em uma linha reta. Imprima GROUNDEDse o vento for tão forte que impossibilite a viagem.

Você pode arredondar para o grau mais próximo e fazê-lo com qualquer método que desejar (cima / baixo / mais próximo / ...).

exemplos

entradas

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

saídas

30
GROUNDED
229

O menor código vence.

Keith Randall
fonte
11
terra plana? ou pequeno tanque de combustível :-)
pmg 04/04
5
Espere ... a terra não é plana?
Keith Randall
11
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Ótimo.
Oleh Prypin
@BlaXpirit: E se os dois vetores estiverem em direções opostas?
Lowjacker
@BlaXpirit: pesquise a sin x + b cos x = cno Google alguns métodos para resolver sua equação. Solving direta pode não ser a melhor maneira de ir aqui, embora ...
Keith Randall

Respostas:

1

J - 155 caracteres

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
)

Por exemplo:

   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

Remova a 0".antecipação yse você não se importar com a sintaxe numérica J ( _para negação unária):

   h 0 0 10 0 100 0 _50
30

Como mencionei na minha resposta Perl, estou apenas aprendendo J, mas gostando de seu poder.

DCharness
fonte
2

Perl - 222 caracteres

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

Algoritmo direto e realmente jogado apenas apertando espaços em branco e comprimento de nome variável, mas achei que precisávamos de uma primeira resposta aqui. Eu tenho aprendido alguns J para jogar golfe; Suspeito que simplesmente traduzir para J (ou Ruby) supere isso prontamente. Off para tentar aqueles.

$X= componente de vento cruzado, $T= componente de vento de cauda. Estamos aterrados se o vento de cauda for realmente um vento de vento (ou seja, negativo) e mais forte que nossa velocidade no ar. Caso contrário, $Cé o ângulo de correção do vento que subtraímos do nosso curso $cpara obter nosso rumo. Precisamos girar o suficiente para equilibrar o vento cruzado com o componente da nossa velocidade na faixa transversal.

DCharness
fonte
0

Perl: 193

É certo que este é (principalmente) o código Perl do DCharness: mas quem não gosta de fonte de reescrita?

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

Além disso, ele produzirá graus fora da especificação (ou seja, <0 ou> 360), mas mencionei a fonte de reescrita automática?

Joel Berger
fonte