宇宙飞船在规则的3D网格周围移动。网格的单元格在右手坐标系xyz中用整数索引。太空飞船从原点开始,沿x轴正方向指向,z轴正方向向上。
飞船将沿着由非空运动序列定义的轨迹飞行。每个运动要么是F
使飞船朝其朝向移动一个单元的(向后)方向,要么是六个旋转之一UDLRlr
。这些对应于以下的俯仰,偏航和横滚:
感谢Zgarb创建该图。
U
p和D
自己将飞船的俯仰改变90度(方向对应于飞船鼻子的运动)。L
和R
左右将飞船的偏航角改变90度。它们只是常规的左转和右转。l
和r
向后是90度的侧倾运动,方向指示哪个机翼向下运动。
请注意,应该始终相对于飞船解释这些内容,以便相关的轴随之旋转。
用数学术语来说,宇宙飞船最初位于位置(0, 0, 0)
,沿着(1, 0, 0)
矢量(0, 0, 1)
指向,指向上方。旋转对应于应用于坐标系的以下矩阵:
U = ( 0 0 -1 D = ( 0 0 1
0 1 0 0 1 0
1 0 0 ) -1 0 0 )
L = ( 0 -1 0 R = ( 0 1 0
1 0 0 -1 0 0
0 0 1 ) 0 0 1 )
l = ( 1 0 0 r = ( 1 0 0
0 0 1 0 0 -1
0 -1 0 ) 0 1 0 )
您应该将飞船的最终位置输出为三个整数x,y,z。输出可以是三个单独的整数或包含它们的列表或字符串。只要您指定它们,它们的顺序可以一致。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
标准高尔夫球适用规则。
测试用例
F => (1, 0, 0)
FDDF => (0, 0, 0)
FDDDF => (1, 0, 1)
LrDDlURRrr => (0, 0, 0)
UFLrRFLRLR => (1, 0, 1)
FFrlFULULF => (3, 0, -1)
LLFRLFDFFD => (-2, 0, -2)
FrrLFLFrDLRFrLLFrFrRRFFFLRlFFLFFRFFLFlFFFlUFDFDrFF => (1, 5, 7)
FUrRLDDlUDDlFlFFFDFrDrLrlUUrFlFFllRLlLlFFLrUFlRlFF => (8, 2, 2)
FFLrlFLRFFFRFrFFFRFFRrFFFDDLFFURlrRFFFlrRFFlDlFFFU => (1, 2, -2)
FLULFLFDURDUFFFLUlFlUFLFRrlDRFFFLFUFrFllFULUFFDRFF => (-3, -2, -3)
工作的例子
这是UFLrRFLRLR
测试用例的中间步骤。在这里,所有中间坐标和方向矢量都在初始的全局坐标系中给出(与飞船的局部坐标系相对):
Cmd. Position Forward Up
( 0, 0, 0) ( 1, 0, 0) ( 0, 0, 1)
U ( 0, 0, 0) ( 0, 0, 1) (-1, 0, 0)
F ( 0, 0, 1) ( 0, 0, 1) (-1, 0, 0)
L ( 0, 0, 1) ( 0, 1, 0) (-1, 0, 0)
r ( 0, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 0, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
F ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
L ( 1, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
L ( 1, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)