Navegación Avión

10

Usted tiene la tarea de planificar una ruta de vuelo para una compañía local de entrega de aviones. Debe enrutar un avión desde el punto A al punto B. Simplemente no puede comenzar en A, apuntar el avión a B y, sin embargo, ir, ya que los vientos dominantes lo desviarán del rumbo. En su lugar, debe averiguar en qué dirección debe apuntar el avión para que vuele directamente a B, teniendo en cuenta el viento.

entrada

7 números de coma flotante, codificación A_x, A_y, B_x, B_y, S, W_x, W_y. Estas son las coordenadas de su inicio y destino, la velocidad del aire de su avión y la fuerza del viento a lo largo de los ejes x e y (la dirección hacia donde sopla el viento , no desde).

salida

Debe imprimir el ángulo en grados (girando en sentido antihorario desde el eje x positivo) que el plano debe apuntar para llegar a B en línea recta. Imprima GROUNDEDsi el viento es tan fuerte que hace imposible el viaje.

Puede redondear al grado más cercano y hacerlo con cualquier método que desee (arriba / abajo / más cercano / ...).

ejemplos

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

salidas

30
GROUNDED
229

El código más corto gana.

Keith Randall
fuente
1
tierra plana? o tanque de combustible pequeño :-)
pmg
55
Espera ... ¿la tierra no es plana?
Keith Randall
1
(Xb-Xa) (V · sinα + Wy) = (Yb-Ya) (V · cosα + Wx) ... Genial.
Oleh Prypin
@BlaXpirit: ¿Qué pasa si los dos vectores están en direcciones opuestas?
Lowjacker
@BlaXpirit: busque a sin x + b cos x = cen Google algunos métodos para resolver su ecuación. Sin embargo, la resolución directa puede no ser la mejor manera de ir aquí ...
Keith Randall

Respuestas:

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 ejemplo:

   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

Elimine el 0".avance de ysi no le importa la sintaxis numérica J ( _para negación unaria):

   h 0 0 10 0 100 0 _50
30

Como mencioné en mi respuesta de Perl, solo estoy aprendiendo J, pero me gusta su poder.

DCharness
fuente
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 directo, y realmente solo jugó apretando espacios en blanco y longitud de nombre variable, pero pensé que necesitábamos una primera respuesta aquí. He estado aprendiendo algo de J para jugar golf; Sospecho que simplemente traducir a J (o Ruby) fácilmente superará esto. A probar esos.

$X= componente de viento cruzado, $T= componente de viento de cola. Estamos castigados si el viento de cola es en realidad un viento de frente (es decir, negativo) y más fuerte que nuestra velocidad aérea. De lo contrario, $Ces el ángulo de corrección del viento que restamos de nuestro rumbo $cpara obtener nuestro rumbo. Necesitamos girar lo suficiente como para equilibrar el viento cruzado con el componente transversal de nuestra velocidad.

DCharness
fuente
0

Perl: 193

Es cierto que este es (principalmente) el código Perl de DCharness: ¿pero a quién no le gusta la fuente de auto reescritura?

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

También generará grados fuera de las especificaciones (es decir, <0 o> 360), pero ¿mencioné la fuente de reescritura automática?

Joel Berger
fuente