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)
Respostas:
MATL ,
7675 bytesIsso funciona na versão atual (12.1.1) do idioma.
Editar (4 de abril de 2016): O comportamento da função
v
foi alterado no release 15.0.0 do idioma. Para executar o código acima, remova o primeirov
e substitua o segundo3$v
. O link a seguir inclui essa modificação.Experimente online !
Explicação
O estado do navio pode ser descrito em termos de duas variáveis:
Uma terceira variável seria a direção em que o navio está voltado, mas isso não é necessário, porque pode ser obtido como a direção inicial (vetor da coluna [
1;0;0]
) vezes a orientação atual; isto é, a primeira coluna da orientação.Essas duas variáveis de estado são mantidas na pilha e atualizadas a cada letra. Cada uma das letras
ULlDRr
multiplica a matriz de orientação por uma das seis matrizes de rotação para atualizar a orientação. CartaF
adiciona a posição atual mais a primeira coluna da matriz de orientação.As seis matrizes de rotação são criadas da seguinte forma: primeiro é introduzido diretamente; o segundo e o terceiro são turnos circulares do anterior; e os três restantes são versões transpostas dos outros.
fonte
Oitava, 175 bytes
Versão legível:
fonte
ES6,
265259 bytesExplicação: Normalmente, para calcular a direção da nave espacial que você iria compor todas as rotações juntos, e, em seguida, para cada movimento que você iria compor o resultado para o vetor unitário com então eu também precisa marcar o início eo fim de cada termo na lista para que eu posso ignorar o resto da string. Ligeiramente não destruído:
F = (1, 0, 0)
(ou, mais simplesmente, extrairia a primeira coluna da matriz). Por exemploFFrlFULULF => F + F + r⋅l⋅F + r⋅l⋅U⋅L⋅L⋅L⋅F
,. Como a multiplicação de matrizes é associativa, as linguagens com multiplicação de matrizes embutidas podem obviamente computar o produto parcial àr⋅l⋅U⋅L⋅L⋅L
medida que avançam, multiplicandoF
necessário para produzir os termos que são então adicionados juntos. Infelizmente, eu não tenho esse luxo, então a opção mais barata é calcular cada termo na expressão acima separadamente, começandoF
e retornando. Para isso, preciso de uma lista para cada uma das ocorrênciasF
de todas as rotações até esse ponto. Eu faço isso usandoreplace
$`
fonte