Na podstawie pomysłu zasugerowanego przez Zgarba .
Statek kosmiczny porusza się po zwykłej siatce 3D. Komórki siatki są indeksowane liczbami całkowitymi w prawym układzie współrzędnych xyz . Statkiem rozpoczyna się od początku, wskazując po dodatniej x osi, przy czym dodatni z oś skierowaną do góry.
Statek kosmiczny będzie latał trajektorią określoną przez niepustą sekwencję ruchów. Każdy ruch jest albo F
(w górę), co powoduje, że statek kosmiczny przesuwa się o jedną komórkę w kierunku, w którym jest skierowany, lub o jeden z sześciu obrotów UDLRlr
. Odpowiada to skokowi, odchyleniu i przewróceniu w następujący sposób:
Dzięki Zgarbowi za stworzenie diagramu.
U
p iD
własne zmieniają skok statku kosmicznego o 90 stopni (gdzie kierunek odpowiada ruchowi nosa statku kosmicznego).L
eft iR
ight zmieniają odchylenie statku kosmicznego o 90 stopni. Są to zwykłe skręty w lewo i prawo.l
eft ir
ight to ruchy toczenia o 90 stopni, których kierunek wskazuje, które skrzydło porusza się w dół.
Pamiętaj, że należy je zawsze interpretować w stosunku do statku kosmicznego, aby odpowiednie osie obracały się wraz z nim.
Z matematycznego punktu widzenia statek kosmiczny początkowo znajduje się w pozycji (0, 0, 0)
, wskazując wzdłuż (1, 0, 0)
wektora, (0, 0, 1)
skierowany w górę. Obroty odpowiadają następującym matrycom zastosowanym w układzie współrzędnych:
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 )
Powinieneś wyprowadzić ostateczną pozycję statku kosmicznego jako trzy liczby całkowite x , y , z . Dane wyjściowe mogą być trzema oddzielnymi liczbami całkowitymi lub listą lub ciągiem je zawierającym. Mogą być w dowolnej spójnej kolejności, o ile ją określisz.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
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)
Przykład działał
Oto pośrednie etapy UFLrRFLRLR
przypadku testowego. Tutaj wszystkie pośrednie współrzędne i wektory kierunkowe są podane w początkowym globalnym układzie współrzędnych (w przeciwieństwie do jednego lokalnego dla statku kosmicznego):
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)
Odpowiedzi:
MATL ,
7675 bajtówDziała to w aktualnej wersji (12.1.1) języka.
Edycja (4 kwietnia 2016 r.): Zachowanie funkcji
v
zmieniło się w wersji 15.0.0 języka. Aby uruchomić powyższy kod, usuń pierwszyv
i zastąp drugi3$v
. Poniższy link zawiera tę modyfikację.Wypróbuj online !
Wyjaśnienie
Stan statku można opisać za pomocą dwóch zmiennych:
Trzecią zmienną byłby kierunek, w którym statek jest zwrócony, ale nie jest to konieczne, ponieważ można go uzyskać jako kierunek początkowy (wektor kolumny [
1;0;0]
) razy bieżąca orientacja; to znaczy pierwsza kolumna orientacji.Te dwie zmienne stanu są przechowywane na stosie i są aktualizowane z każdą literą. Każda z liter
ULlDRr
zwielokrotnia macierz orientacji przez jedną z sześciu macierzy obrotu, aby zaktualizować orientację. LiteraF
dodaje bieżącą pozycję plus pierwszą kolumnę macierzy orientacji.Sześć macierzy obrotu tworzy się w następujący sposób: pierwszy jest wprowadzany bezpośrednio; druga i trzecia to przesunięcia kołowe poprzedniej; a pozostałe trzy to transponowane wersje pozostałych.
źródło
Oktawa, 175 bajtów
Wersja do odczytu:
źródło
ES6,
265259 bajtówObjaśnienie: Zwykle w celu obliczenia kierunku statku kosmicznego ułożyłbyś wszystkie obroty razem, a następnie dla każdego ruchu skomponowałbyś wynik do wektora jednostki
F = (1, 0, 0)
(lub, po prostu, wyodrębnił pierwszą kolumnę macierzy). Na przykładFFrlFULULF => F + F + r⋅l⋅F + r⋅l⋅U⋅L⋅L⋅L⋅F
. Ponieważ mnożenie macierzy jest asocjacyjne, języki z wbudowanym mnożeniem macierzy mogą oczywiście obliczać iloczyn częściowyr⋅l⋅U⋅L⋅L⋅L
wraz z upływem czasu, mnożąc przez to,F
co konieczne, aby utworzyć warunki, które są następnie sumowane. Niestety nie mam tego luksusu, więc najtańszą opcją jest obliczenie każdego terminu w powyższym wyrażeniu osobno, zaczynając odF
i pracując wstecz. W tym celu potrzebuję listy dla każdego wystąpieniaF
wszystkich obrotów do tego momentu. Robię to za pomocąreplace
z$`
więc muszę również zaznaczyć początek i koniec każdego terminu na liście, aby móc zignorować resztę ciągu. Nieznacznie nie golfista:źródło