Basé sur une idée suggérée par Zgarb .
Un vaisseau spatial se déplace autour d'une grille 3D régulière. Les cellules de la grille sont indexées avec des entiers dans un système de coordonnées droitier, xyz . Le vaisseau spatial commence à l'origine, pointant le long de l' axe x positif , l' axe z positif pointant vers le haut.
Le vaisseau spatial volera le long d'une trajectoire définie par une séquence de mouvements non vide. Chaque mouvement se fait soit F
( ou vers l' intérieur) ce qui fait que le vaisseau spatial se déplace d'une cellule dans la direction de son orientation, ou l'une des six rotations UDLRlr
. Cela correspond au tangage, au lacet et au roulis comme suit:
Merci à Zgarb d'avoir créé le diagramme.
U
p etD
propre modifient l'inclinaison du vaisseau spatial de 90 degrés (où la direction correspond au mouvement du nez du vaisseau spatial).L
eft etR
ight modifient le lacet du vaisseau spatial de 90 degrés. Ce ne sont que des virages à gauche et à droite réguliers.l
eft etr
ight sont des mouvements de roulement à 90 degrés, où la direction indique quelle aile se déplace vers le bas.
Notez que ceux-ci doivent toujours être interprétés par rapport au vaisseau spatial afin que les axes concernés tournent avec lui.
En termes mathématiques, le vaisseau spatial est initialement en position (0, 0, 0)
, pointant le long du (1, 0, 0)
vecteur, (0, 0, 1)
pointant vers le haut. Les rotations correspondent aux matrices suivantes appliquées au système de coordonnées:
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 )
Vous devez afficher la position finale du vaisseau spatial sous la forme de trois entiers x , y , z . La sortie peut être trois entiers distincts ou une liste ou une chaîne les contenant. Ils peuvent être dans n'importe quel ordre cohérent tant que vous le spécifiez.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Les règles de code-golf standard s'appliquent.
Cas de 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)
Exemple travaillé
Voici les étapes intermédiaires du UFLrRFLRLR
cas de test. Ici, toutes les coordonnées intermédiaires et les vecteurs de direction sont donnés dans le système de coordonnées global initial (par opposition à un local du vaisseau spatial):
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)