Gdzie teraz jestem?
Biorąc pod uwagę ciąg znaków d
, zawierający tylko litery NSWE
, określ współrzędne, które podróżowałem (od lewej do prawej, pochłaniając zachłannie) i ostateczną współrzędną, w której przebywam.
Reguły odczytu współrzędnych od lewej do prawej:
- Jeśli następnym znakiem jest
N
lubS
:- Jeśli znak po
N
lubS
jest innyN
lubS
:- Spożywać tylko pierwszy
N
lubS
. - Wyjście
[0,1]
dlaN
- Wyjście
[0,-1]
dlaS
- Spożywać tylko pierwszy
- Jeśli znak po
N
alboS
jestW
alboE
:- Spożywać oba
N
lubS
iW
lubE
. - Dane wyjściowe
[1,1]
lub odpowiednio[-1,1]
dlaNE
iNW
. - Dane wyjściowe
[1,-1]
lub odpowiednio[-1,-1]
dlaSE
iSW
.
- Spożywać oba
- Jeśli znak po
- Jeśli znak jest
E
lubW
nie poprzedzoneS
lubN
:- Spożywać
E
lubW
. - Wyjście
[1,0]
dlaE
. - Wyjście
[-1,0]
dlaW
.
- Spożywać
Przykład działania
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Uwaga: może to być dowolny format, oto inne przykłady prawidłowych danych wyjściowych:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
Itp...
Więcej przykładów
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NNEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
NEN
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
Zasady
- Możesz drukować w dowolnym dogodnym formacie, który nie narusza luk.
- Musisz jeść łapczywie,
NWE
nigdyN,W,E
nie jest, zawsze jestNW,E
.- Dotyczy to:
SW*
,SE*
,NW*
,NE*
. - Chciwie pochłaniasz od lewej do prawej.
- Dotyczy to:
- Jest to golf golfowy , wygrywa najmniej bajtów.
[4, 3]
ułatwiłby nieco zobaczenie, co się dzieje w wyniku testu.1
,-1j
,(-1+1j)
etc poprawny format wyjściowy?NE
czy toN+E
nie powinno mieć znaczenia?Odpowiedzi:
Python 2 , 116 bajtów
Wypróbuj online!
Z wyjściem jako
[(3+4j), 1, -1j, …]
, 91 bajtówWypróbuj online!
Ta lambda zwraca listę liczb całkowitych Gaussa : pierwsza to ostatnia współrzędna, a wszystkie pozostałe to kroki niezbędne do jej osiągnięcia.
źródło
Attache , 80 bajtów
Wypróbuj online!
Jest to anonimowa funkcja, która pobiera jeden argument ciągu.
Wyjaśnienie
Pierwszym zadaniem jest wdrożenie etapu analizy tego pytania. Najkrótsze okazało się użycie prostego wyrażenia regularnego do analizy danych wejściowych (
_
):To pasuje do wszystkich wystąpień wyrażenia regularnego
[NS][WE]|.
, jak widać w wielu innych odpowiedziach. To łapczywie daje żądane wskazówki.Teraz zastosujemy funkcję skrótu do każdego direcitonu. Bierzemy punkty kodowe każdego kierunku i sumujemy je. Daje to następujące mapowanie:
Spróbujemy zmapować te wartości na mniejszą domenę; modulo jest do tego przydatne, a my możemy wykazać, że najmniejszym modułem, który daje unikalne wartości dla wszystkich podanych danych wejściowych, jest 11. Sortowanie według reszty, daje nam następującą tabelę:
Teraz mamy korespondencję wejściową, jako kodowanie przez
Sum@Ords=>[...]%11
. Następnie musimy przekształcić te resztki w punkty. Postaramy się uzyskać inne mapowanie, co oznacza, że przydatne będzie wstawienie „wartości wypełniania rzadkiego” do skrótów, które nie odpowiadają kierunkom:Obecnie mamy szereg punktów, które mogą dać listę indeksowaną przez skrót:
Teraz skompresujemy to, widząc, jak składa się tylko z
-1
s,0
s i1
s. Ponieważ lista reprezentuje pary, możemy spłaszczyć listę bez utraty danych. Następnie, jeśli weźmiemy każdą liczbęx
i obliczymy1-x
, otrzymamy następującą listę:Możemy przekonwertować to na podstawową liczbę 3:
Konwersja do bazy 10:
Podsumowując, wzięliśmy nasze punkty, sparowaliśmy je, wzięliśmy każdy element odejmowany
1
i przekształcaliśmy z bazy3
, dając nam22260446188
. Możemy dekompresować jako taki:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
To daje nam nasz oryginalny zestaw par. Następnie możemy wykonać wyżej wymienione indeksowanie w następujący sposób:
Ponieważ w Attache indeksowanie według tablicy zwraca wszystkie elementy odpowiadające tym indeksom. (Tak więc
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
.) Teraz mamy wskazówki ścieżki, którą kroczył PO. Pozostało tylko obliczyć sumę.Przechwytujemy więc ten wynik w lambda
{...}
i umieszczamy jako pierwszą funkcję w kompozycji funkcji (a##b
), przy czym drugą jestV#Sum
. To jest rozwidlenie, które przy danych wejściowychx
rozwija się jako:Sum
, gdy otrzyma tablicę 2D, sumuje każdą kolumnę w tablicy (w wyniku sumowania wektorowego). Tak więc łączy kierunki z ostatecznym miejscem docelowym i mamy nasz końcowy wynik.źródło
JavaScript (ES6), 102 bajty
Zwraca ciąg.
Wypróbuj online!
źródło
MATL , 45 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Objaśnienie (z przykładem)
Rozważ dane wejściowe
'NSWE'
jako przykład.źródło
Java (JDK 10) , 171 bajtów
Wypróbuj online!
Objaśnienia
Dzięki temu
c=~-s[i]/6%4
odbywa się następujące mapowanie:NS
jest sprawdzanyc<2
zi odwzorowywany na+1
/-1
using1-c*2
;EW
jest sprawdzane za pomocąc>1
i mapowane na+1
/-1
usingc*2-5
.Kredyty
źródło
Retina 0.8.2 , 93 bajty
Wypróbuj online! Wyjaśnienie:
Zduplikuj dane wejściowe.
Podziel pierwszą kopię na kierunki.
Usuń zbędne puste linie utworzone w powyższym procesie.
Zmień
W
na,J
aby sortować pomiędzyE
iN
. (PrzejścieE
pomiędzyS
iW
również by działało.)Sortuj każdą linię w kolejności.
Usuń pary przeciwnych kierunków (wpływa to oczywiście tylko na ostatnią linię).
Policz liczbę ruchów poziomych i pionowych, dodając znaki w razie potrzeby.
Ci z was, którzy znają różnice między Retina 0.8.2 i Retina 1, będą chcieli zaznaczyć, że mogę zapisać 2 bajty w Retina 1, ponieważ używa
*
zamiast niej$*
. Podczas gdy tam byłem, próbowałem uprościć proces dzielenia, ale nie byłem w stanie dalej zmniejszyć liczby bajtów, byłem w stanie to zrównać z tym:źródło
Java 10,
269265243 bajtówZdecydowanie niewłaściwy język dla tego wyzwania.
Wypróbuj online.
Wyjaśnienie:
źródło
Perl 5
-n
, 94 bajtówWypróbuj online!
źródło
JavaScript (ES6), 102 bajty
Zwraca ciąg.
źródło
Rubinowy ,
7571 bajtówWypróbuj online!
-4 bajty dzięki benj2240.
Ponieważ zwracanie liczb zespolonych wydaje się być akceptowalnym formatem wyjściowym, myślę, że nie będzie dużo bardziej golfa niż tylko zrobienie portu bardzo ładnej odpowiedzi Lynn .
źródło
map
, przekazując jego blok bezpośrednio dosum
: Wypróbuj online!F # (mono) , 269 bajtów
Wypróbuj online!
źródło
NSWE
aktualnie wyprowadzanie(0,1)
,(-1,-1)
,(1,0)
, ale czwarte wyjście powinno być sumą tych współrzędnych, tak(0,0)
(bo0+-1+1 = 0
a1+-1+0 = 0
).sed, 125
Korzystanie ze swobód w wersji formatu wyjściowego :
Wynik obejmuje +1 dla
-r
parametru do sed.Wypróbuj online .
Dane wyjściowe są następujące:
A
znaków reprezentuje liczbę całkowitą + velen(string)
a
znaków reprezentuje liczbę całkowitą -ve-len(string)
0
Na przykład:
,
wynosi [0,0],AA
wynosi [0,2]aaa,
jest [-3,0]sed 4.2.2, w tym rozszerzenie GNU exec , 147
Rozsądny format wersja:
Wynik obejmuje +1 dla
-r
parametru do sed.Dane wyjściowe są podawane jako współrzędne rozdzielone spacjami, po jednym w wierszu. Istnieje dodatkowa nowa linia między przedostatnimi i ostatecznymi zbiorami współrzędnych - nie jestem pewien, czy jest to problematyczne, czy nie.
Wypróbuj online!
źródło
PHP, 153 bajty
niech regex dokona podziału; przeglądaj mecze, drukuj i podsumowuj wyniki pośrednie:
Uruchom jako potok z
-nR
lub spróbuj online .źródło
C (gcc) , 173 bajtów
Interesujące jest robienie tego w języku bez obsługi wyrażeń regularnych!
Wypróbuj online!
źródło