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)
Antworten:
MATL ,
7675 BytesDies funktioniert in der aktuellen Version (12.1.1) der Sprache.
Bearbeiten (4. April 2016): Das Funktionsverhalten
v
wurde in Version 15.0.0 der Sprache geändert. Entfernen Sie das erste,v
und ersetzen Sie das zweite, um den obigen Code auszuführen3$v
. Der folgende Link enthält diese Änderung.Probieren Sie es online !
Erläuterung
Der Zustand des Schiffes kann mit zwei Variablen beschrieben werden:
Eine dritte Variable wäre die Richtung, in die das Schiff blickt, dies ist jedoch nicht erforderlich, da sie als Anfangsrichtung (Spaltenvektor [
1;0;0]
) multipliziert mit der aktuellen Ausrichtung erhalten werden kann. das ist die erste Spalte der Orientierung.Diese beiden Statusvariablen werden auf dem Stapel gespeichert und mit jedem Buchstaben aktualisiert. Jeder der Buchstaben
ULlDRr
multipliziert die Orientierungsmatrix mit einer der sechs Rotationsmatrizen, um die Orientierung zu aktualisieren. LetterF
fügt die aktuelle Position plus die erste Spalte der Orientierungsmatrix hinzu.Die sechs Rotationsmatrizen werden wie folgt erzeugt: Zuerst wird direkt eingeführt; zweite und dritte sind kreisförmige Verschiebungen der vorherigen; und die restlichen drei sind transponierte Versionen der anderen.
quelle
Oktave, 175 Bytes
Lesbare Version:
quelle
ES6,
265259 BytesErklärung: Um die Richtung des Raumschiffs zu berechnen, würden Sie normalerweise alle Rotationen zusammensetzen und dann für jede Bewegung das Ergebnis zum Einheitsvektor zusammensetzen
F = (1, 0, 0)
(oder einfach die erste Spalte der Matrix extrahieren). Zum BeispielFFrlFULULF => F + F + r⋅l⋅F + r⋅l⋅U⋅L⋅L⋅L⋅F
. Da die Matrixmultiplikation assoziativ ist, können Sprachen mit integrierter Matrixmultiplikation offensichtlich das Teilprodukt berechnenr⋅l⋅U⋅L⋅L⋅L
, indem sie nachF
Bedarf multipliziert werden , um die Terme zu erzeugen, die dann addiert werden. Leider habe ich diesen Luxus nicht, daher ist es die billigste Möglichkeit, jeden Begriff im obigen Ausdruck separat zu berechnen, beginnend mitF
und abarbeitend. Dafür benötige ich eine Liste für jedes VorkommenF
aller Rotationen bis zu diesem Punkt. Ich mache das mitreplace
mit$`
so muß ich auch den Beginn und das Ende jeden Begriff in der Liste markieren , so dass ich den Rest der Zeichenfolge ignorieren kann. Leicht ungolfed:quelle