Jeśli ktoś skierowany na północ w punkcie A na tej siatce chciał, aby wskazówki podążały zieloną ścieżką (ponieważ mogą tylko podążać za liniami siatki) do punktu B, możesz im powiedzieć:
Go North, North, West, East, East, South, East, East
.
lub równoważnie
Go Forward, Forward, Left, Back, Forward, Right, Left, Forward
.
(Jeżeli polecenie „w prawo” , „w lewo” lub „w tył” domyślnie oznacza zwrot w tym kierunku, to idź naprzód.)
Napisz funkcję z jednym argumentem, który tłumaczy te bezwzględne i względne kierunki wzdłuż tej samej ścieżki , a nie tylko w tym samym punkcie. Załóżmy, że kierowana osoba zawsze zaczyna skierowaną na północ.
Jeśli argument jest ciągiem liter NSEW
, zwróć równoważne kierunki względne.
np. f("NNWEESEE")
zwraca ciąg FFLBFRLF
.
Jeśli argument jest ciągiem liter FBLR
, zwróć równoważne bezwzględne kierunki.
np. f("FFLBFRLF")
zwraca ciąg NNWEESEE
.
Pusty ciąg ustępuje. Nie zakładaj żadnych innych przypadków wprowadzania danych.
Jeśli twój język nie ma funkcji lub łańcuchów, użyj tego, co wydaje się najbardziej odpowiednie.
Najkrótszy kod w bajtach wygrywa.
R
równa sięE
na początku.Odpowiedzi:
CJam,
575349Poprzednia wersja
Przykład:
Wynik:
Jak to działa
źródło
C ++,
9997Poniższe sformatowano jako wyrażenie lambda. Wymaga jednego
char*
argumentu i zastępuje go.Dla tych, którzy nie znają tej funkcji (jak ja 1 godzinę temu), użyj jej w następujący sposób:
Kilka wyjaśnień:
flag ? (x = y) : (x += z)
, druga para nawiasów jest wymagana w C. Więc zamiast tego użyłem C ++!*s*9%37&4
testuje pierwszy bajt; wynik wynosi 4, jeśli jest jednym zNESW
; 0 w przeciwnym razie*s%11/3
konwertuje bajtyNESW
na 0, 1, 2, 3*s%73%10
konwertuje bajtyFRBL
na 0, 9, 6, 3 (czyli 0, 1, 2, 3 modulo 4)d
zmiennej. Próbowałem zmienić układ kodu, aby go całkowicie wyeliminować, ale wydaje się to niemożliwe ...źródło
JavaScript (E6) 84
86 88 92 104Edycja: przy użyciu & zamiast% inny priorytet operatora (mniej nawiasów) i działa lepiej z liczbami ujemnymi
Edit2: | zamiast +, znowu pierwszeństwo op, -2. Dzięki DocMax
Edit3: zrozumienie tablicy jest o 2 znaki krótsze niż map () dla ciągów
Testuj w konsoli FireFox / FireBug
Wynik
źródło
&& o
na końcu znaczy?array && value
ewaluuj dovalue
dowolnej tablicy do ocenytruthy
4+(n-d&3)
go4|n-d&3
i zapisać 2 znaki.APL, 72
Jeśli konfiguracje tłumacza można zmienić bez kary, wynik wynosi 66 , zmieniając
⎕IO
na0
:źródło
Python,
171139Nie jest to tak krótkie jak inne rozwiązania, ale myślę, że powinno to być względnie dobre dla tego, co można zrobić z Pythonem:
Rozszerzona wersja dla nieco lepszej czytelności:
źródło
Idź, 201
Wersja do odczytu:
źródło
GNU sed, 356 bajtów
Wyzwanie wymaga prostej transformacji w strumieniu postaci.
sed
, edytor strumieni to oczywisty wybór języka ;-)(Komentarze i spacje usuwane do celów obliczania wyniku golfa)
Wynik:
Wyjaśnienie:
Chodzi o to, że kiedy zmieniamy układ odniesienia, zawsze istnieje bezpośrednie odwzorowanie między
{N, E, S, W}
i{F, R, B, L}
.W przypadku wartości bezwzględnej do względnej pracujemy w przód przez łańcuch. Dla każdego znaku możemy mapować
{N, E, S, W}
do{F, R, B, L}
, a następnie obróć pozostałe[NESW]
znaki zgodnie z charakterem po prostu odwzorowanym, a następnie przejść do następnego znaku.W przypadku wartości względnej do absolutnej robimy odwrotnie. Pracujemy wstecz przez sznurek, obracając wszystkie kolejne
[NESW]
znaki zgodnie z postacią znajdującą się bezpośrednio przed nią. Następnie mapę tę postać{N, E, S, W}
do{F, R, B, L}
, aż dojdziemy do początku łańcucha.źródło
Haskell, 224
To przypisuje liczby obrotów do względnych kierunków, a numery orientacji do bezwzględnych kierunków, a następnie znajduje obrót między kolejnymi orientacjami lub orientacje po kolejnych obrotach.
i
Funkcja znajdzie indeks w dwóch legendy.źródło