Основано на идее, предложенной Згарбом .
Космический корабль движется вокруг обычной трехмерной сетки. Ячейки сетки индексируются целыми числами в правой системе координат xyz . Космический корабль начинается в начале координат, указывая вдоль положительной оси x , с положительным z ось направлена вверх.
Космический корабль будет лететь по траектории, определяемой непустой последовательностью движений. Каждое движение либо F
( или вперед) заставляет космический корабль двигаться на одну клетку в направлении, обращенном к нему, либо на одно из шести вращений UDLRlr
. Они соответствуют тангажу, рысканию и крену следующим образом:
Спасибо Згарбу за создание диаграммы.
U
p иD
собственной изменяют угол наклона космического корабля на 90 градусов (где направление соответствует движению носа космического корабля).L
Eft и ightR
изменяют угол наклона космического корабля на 90 градусов. Они просто обычные левый и правый повороты.l
eft и ightr
- 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)