Baseado em uma idéia sugerida por Zgarb .
Uma nave espacial está se movendo em torno de uma grade 3D regular. As células da grade são indexadas com números inteiros em um sistema de coordenadas destro, xyz . A nave espacial começa na origem, apontando ao longo do x positivo eixo , com o eixo z positivo apontando para cima.
A nave espacial voará ao longo de uma trajetória definida por uma sequência não vazia de movimentos. Cada movimento é F
(para a frente), o que faz a nave espacial mover uma célula na direção em que está virada, ou uma das seis rotações UDLRlr
. Corresponde a pitch, yaw e roll da seguinte maneira:
Obrigado ao Zgarb por criar o diagrama.
U
peD
próprio alteram o tom da nave espacial em 90 graus (onde a direção corresponde ao movimento do nariz da nave espacial).L
eft eR
ight mudam a guinada da nave espacial em 90 graus. São apenas curvas regulares à esquerda e à direita.l
eft er
ight são movimentos de rolagem de 90 graus, em que a direção indica qual asa se move para baixo.
Observe que eles sempre devem ser interpretados em relação à nave espacial, para que os eixos relevantes girem junto com ela.
Em termos matemáticos, a nave espacial está inicialmente na posição (0, 0, 0)
, apontando ao longo do (1, 0, 0)
vetor e (0, 0, 1)
apontando para cima. As rotações correspondem às seguintes matrizes aplicadas ao sistema de coordenadas:
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 )
Você deve exibir a posição final da nave espacial como três números inteiros x , y , z . A saída pode ser três números inteiros separados ou uma lista ou sequência que os contenha. Eles podem estar em qualquer ordem consistente, desde que você o especifique.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e exibindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Aplicam-se as regras de código-golfe padrão .
Casos de teste
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)
Exemplo trabalhado
Aqui estão as etapas intermediárias do UFLrRFLRLR
caso de teste. Aqui, todas as coordenadas intermediárias e vetores de direção são dados no sistema de coordenadas global inicial (em oposição a um local da nave espacial):
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)