飞机导航


10

您的任务是为当地飞机交付公司计划一条飞行路线。您需要将飞机从A点路由到B点。您只是无法从A点出发,将飞机指向B点,然后再走,因为盛行的风将使您偏离航向。相反,您需要考虑风向,找出应该指向飞机的方向,以便飞机直接飞向B。

输入

7个浮点数,编码为A_x,A_y,B_x,B_y,S,W_x,W_y。这些是起点和终点的坐标,飞机的空速以及沿x轴和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
平坦的地球?或小型油箱:-)
2011年

5
等等...地球不平坦吗?
基思·兰德尔

1
(Xb-Xa)(V·sinα+ Wy)=(Yb-Ya)(V·cosα+ Wx)...很好。
Oleh Prypin 2011年

@BlaXpirit:如果两个向量方向相反怎么办?
Lowjacker 2011年

@BlaXpirit:a sin x + b cos x = c在Google上搜索一些求解方程式的方法。不过,直接解决可能并不是最好的选择……
Keith Randall

Answers:


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

如果您不介意J数字语法(对于一元否定),请删除0".前面的内容:y_

   h 0 0 10 0 100 0 _50
30

正如我在Perl答案中提到的那样,我只学习J,但是喜欢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

诚然,这(主要是)DCharness的Perl代码:但是谁不喜欢自我重写源代码?

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),但是我是否提到了自重写源?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.