Zgarbによって提案されたアイデアに基づいています。
宇宙船は通常の3Dグリッドを動き回っています。グリッドのセルには、右手座標系xyzの整数でインデックスが付けられます。宇宙船は原点から始まり、正のxに沿って向きます軸に、正のz軸が上向きになります。
宇宙船は、空ではない一連の動きによって定義される軌道に沿って飛行します。各動きはF
、宇宙船がそのセルの向きに沿って1つのセルを移動させる(順方向)、または6つの回転のいずれかですUDLRlr
。これらは次のようにピッチ、ヨー、ロールに対応します。
ダイアグラムを作成してくれたZgarbに感謝します。
U
pとD
自分自身で宇宙船のピッチを90度変更します(方向は宇宙船の機首の動きに対応します)。L
エフトとR
ightは、宇宙船のヨーを90度変化させます。彼らはちょうど通常の左と右のターンです。l
eftとr
ightは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 )
宇宙船の最終位置を3つの整数x、y、zとして出力する必要があります。出力は、3つの個別の整数、またはそれらを含むリストまたは文字列です。指定する限り、一貫した順序で並べられます。
プログラムまたは関数を作成し、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)