Basierend auf einer Idee von Zgarb .
Ein Raumschiff bewegt sich um ein normales 3D-Gitter. Die Zellen des Gitters sind mit ganzen Zahlen in einem rechtshändigen Koordinatensystem, xyz, indiziert . Das Raumschiff beginnt am Ursprung und zeigt entlang der positiven x- Achse, wobei die positive z- Achse nach oben zeigt.
Das Raumschiff fliegt entlang einer Flugbahn, die durch einen nicht leeren Bewegungsablauf definiert ist. Jede Bewegung ist entweder F
(oder vorwärts), wodurch sich das Raumschiff um eine Zelle in Richtung seiner Ausrichtung bewegt, oder eine der sechs Umdrehungen UDLRlr
. Dies entspricht dem Pitch, Yaw und Roll wie folgt:
Vielen Dank an Zgarb für die Erstellung des Diagramms.
U
p undD
own ändern die Tonhöhe des Raumschiffs um 90 Grad (wobei die Richtung der Bewegung der Nase des Raumschiffs entspricht).L
Nach undR
nach ändert sich das Gieren des Raumschiffs um 90 Grad. Sie sind nur regelmäßige Links- und Rechtskurven.l
Eft undr
Eight sind 90-Grad-Rollbewegungen, wobei die Richtung angibt, welcher Flügel sich nach unten bewegt.
Beachten Sie, dass diese immer relativ zum Raumschiff interpretiert werden sollten, damit die relevanten Achsen mitrotieren.
Mathematisch gesehen befindet sich das Raumschiff zunächst an einer Position (0, 0, 0)
, die entlang des (1, 0, 0)
Vektors zeigt und (0, 0, 1)
nach oben zeigt. Die Rotationen entsprechen den folgenden Matrizen, die auf das Koordinatensystem angewendet werden:
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 )
Sie sollten die endgültige Position des Raumschiffs als drei ganze Zahlen x , y , z ausgeben . Die Ausgabe kann aus drei separaten Ganzzahlen oder einer Liste oder Zeichenfolge bestehen, die sie enthält. Sie können in beliebiger Reihenfolge angeordnet sein, solange Sie dies angeben.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Es gelten die Standardregeln für Code-Golf .
Testfälle
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)
Gearbeitetes Beispiel
Hier sind die Zwischenschritte des UFLrRFLRLR
Testfalls. Hier werden alle Zwischenkoordinaten und Richtungsvektoren im anfänglichen globalen Koordinatensystem (im Gegensatz zu einem lokalen zum Raumschiff) angegeben:
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)