Basado en una idea sugerida por Zgarb .
Una nave espacial se mueve alrededor de una cuadrícula 3D normal. Las celdas de la cuadrícula se indexan con números enteros en un sistema de coordenadas diestro, xyz . La nave espacial comienza en el origen, apuntando a lo largo del eje x positivo , con el eje z positivo apuntando hacia arriba.
La nave espacial volará a lo largo de una trayectoria definida por una secuencia de movimientos no vacía. Cada movimiento es F
(hacia adelante), lo que hace que la nave espacial se mueva una celda en la dirección de su orientación, o una de las seis rotaciones UDLRlr
. Esto corresponde a cabeceo, guiñada y balanceo de la siguiente manera:
Gracias a Zgarb por crear el diagrama.
U
p yD
own cambian el tono de la nave espacial en 90 grados (donde la dirección corresponde al movimiento de la nariz de la nave espacial).L
eft yR
ight cambian el guiñada de la nave espacial en 90 grados. Son solo giros regulares a izquierda y derecha.l
eft yr
ight son movimientos de balanceo de 90 grados, donde la dirección indica qué ala se mueve hacia abajo.
Tenga en cuenta que estos siempre deben interpretarse en relación con la nave espacial para que los ejes relevantes roten junto con ella.
En términos matemáticos, la nave espacial está inicialmente en posición (0, 0, 0)
, apuntando a lo largo del (1, 0, 0)
vector, (0, 0, 1)
apuntando hacia arriba. Las rotaciones corresponden a las siguientes matrices aplicadas al 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 )
Deberías mostrar la posición final de la nave espacial como tres enteros x , y , z . La salida puede ser tres enteros separados o una lista o cadena que los contiene. Pueden estar en un orden constante siempre que lo especifique.
Puede escribir un programa o función, tomando datos a través de STDIN (o la alternativa más cercana), argumento de línea de comandos o argumento de función y generando el resultado a través de STDOUT (o alternativa más cercana), valor de retorno de función o parámetro de función (out).
Se aplican reglas estándar de código de golf .
Casos de prueba
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)
Ejemplo trabajado
Aquí están los pasos intermedios del UFLrRFLRLR
caso de prueba. Aquí, todas las coordenadas intermedias y los vectores de dirección se dan en el sistema de coordenadas global inicial (en oposición a uno local de la 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)
Respuestas:
MATL ,
7675 bytesEsto funciona en la versión actual (12.1.1) del lenguaje.
Editar (4 de abril de 2016): el comportamiento de la función
v
ha cambiado en la versión 15.0.0 del lenguaje. Para ejecutar el código anterior, elimine el primerov
y reemplace el segundo3$v
. El siguiente enlace incluye esta modificación.Pruébalo en línea !
Explicación
El estado del barco se puede describir en términos de dos variables:
Una tercera variable sería la dirección en la que se enfrenta la nave, pero eso no es necesario, ya que puede obtenerse como la dirección inicial (vector de columna [
1;0;0]
) multiplicada por la orientación actual; es decir, la primera columna de la orientación.Estas dos variables de estado se mantienen en la pila y se actualizan con cada letra. Cada una de las letras
ULlDRr
multiplica la matriz de orientación por una de las seis matrices de rotación para actualizar la orientación. LetterF
agrega la posición actual más la primera columna de la matriz de orientación.Las seis matrices de rotación se crean de la siguiente manera: primero se introduce directamente; segundo y tercero son desplazamientos circulares del anterior; y los tres restantes son versiones transpuestas de los otros.
fuente
Octava, 175 bytes
Versión legible:
fuente
ES6,
265259 bytesExplicación: Normalmente, para calcular la dirección de la nave espacial, compondría todas las rotaciones juntas, y luego, para cada movimiento, compondría el resultado en el vector unitario
F = (1, 0, 0)
(o simplemente extraería la primera columna de la matriz). Por ejemplo,FFrlFULULF => F + F + r⋅l⋅F + r⋅l⋅U⋅L⋅L⋅L⋅F
. Dado que la multiplicación matricial es asociativa, los lenguajes con multiplicación matricial incorporada obviamente pueden calcular el producto parcial ar⋅l⋅U⋅L⋅L⋅L
medida que avanzan, multiplicándose segúnF
sea necesario para producir los términos que luego se suman. Desafortunadamente, no tengo ese lujo, por lo que la opción más barata es calcular cada término en la expresión anterior por separado, comenzandoF
y trabajando hacia atrás. Para eso, necesito una lista para cada una de las ocurrenciasF
de todas las rotaciones hasta ese punto. Hago esto usandoreplace
con,$`
así que también necesito marcar el inicio y el final de cada término en la lista para poder ignorar el resto de la cadena. Ligeramente no golfista:fuente