На основі ідеї, запропонованої Згарбом .
Космічний корабель рухається навколо звичайної 3D-сітки. Осередки сітки індексуються цілими числами в правій системі координат, xyz . Космічний корабель починається з початку, вказуючи вздовж позитивної осі x , позитивна вісь z спрямована вгору.
Космічний корабель пролетить по траєкторії, визначеній не порожньою послідовністю рухів. Кожен рух або F
( або вперед), що змушує космічний корабель переміщати одну клітинку у напрямку до неї, або один із шести обертів UDLRlr
. Вони відповідають тону, нахилу та кочення так:
Дякую Згарбу за створення діаграми.
U
p іD
власне змінюють крок космічного корабля на 90 градусів (де напрямок відповідає руху носа космічного корабля).L
eft і яR
міняю позіхання космічного корабля на 90 градусів. Вони просто регулярні лівий і правий повороти.l
eft andr
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 )
Ви повинні вивести кінцеве положення космічного корабля у вигляді трьох цілих чисел 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)