Basato su un'idea suggerita da Zgarb .
Un'astronave si muove attorno a una normale griglia 3D. Le celle della griglia sono indicizzate con numeri interi in un sistema di coordinate destrorso, xyz . L'astronave inizia all'origine, puntando lungo l' asse x positivo , con l' asse z positivo rivolto verso l'alto.
L'astronave volerà lungo una traiettoria definita da una sequenza di movimenti non vuota. Ogni movimento è F(verso oriente) che fa muovere l'astronave di una cella nella direzione in cui è rivolta, o una delle sei rotazioni UDLRlr. Questi corrispondono a beccheggio, imbardata e rollio come segue:

Grazie a Zgarb per aver creato il diagramma.
Up eDproprio cambiare il passo dell'astronave di 90 gradi (dove la direzione corrisponde al movimento del naso dell'astronave).Logni volta cheRcambia l'imbardata della nave spaziale di 90 gradi. Sono solo curve a destra e sinistra.left eright sono movimenti di rotolamento di 90 gradi, dove la direzione indica quale ala si muove verso il basso.
Si noti che questi devono sempre essere interpretati in relazione all'astronave in modo che gli assi pertinenti ruotino insieme ad essa.
In termini matematici, l'astronave è inizialmente in posizione (0, 0, 0), che punta lungo il (1, 0, 0)vettore, con la (0, 0, 1)punta verso l'alto. Le rotazioni corrispondono alle seguenti matrici applicate al sistema di coordinate:
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 )
Dovresti emettere la posizione finale dell'astronave come tre numeri interi x , y , z . L'output può essere tre numeri interi separati o un elenco o una stringa che li contiene. Possono essere in qualsiasi ordine coerente purché tu lo specifichi.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
Si applicano le regole standard del code-golf .
Casi test
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)
Esempio lavorato
Ecco i passaggi intermedi del UFLrRFLRLRtest case. Qui, tutte le coordinate intermedie e i vettori di direzione sono indicati nel sistema di coordinate globale iniziale (al contrario di un locale dell'astronave):
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)