streszczenie
Zadaniem jest nawigacja łazikiem Mars i podanie jego ostatecznych współrzędnych i kierunku.
Wejście:
Pierwsze wejście:
Najpierw program musi pobrać dane wejściowe w następującym formacie:
[X-Coordinate],[Y-Coordinate],[Direction]
Kierunek musi być: N
lub S
lub E
lub W
(litery początkowe z północy, południa, zachodu, wschodu)
Przykład: 10,20,N
(x = 10, y = 20, kierunek = N (północ))
Drugie wejście:
Drugie wejście składa się z serii R
, L
, M
na prawo, w lewo i przejść odpowiednio.
Dla R
i L
(prawo i lewo) kierunek łazika musi się odpowiednio zmienić.
Ponieważ M
łazik musi ruszyć się o 1 jednostkę do przodu w kierunku, w którym był przed ruchem.
Zasady obliczania współrzędnych:
N = Y + 1
E = X + 1
S = Y - 1
W = X - 1
Wynik:
Ostateczne współrzędne i aktualny kierunek łazika.
Przykład:
Enter initial data: 1,2,N
Enter the instructions: MRMLM
Output: 2,4,N
Współrzędne mogą być dowolnymi liczbami całkowitymi i mogą być ujemne .
Wszystkie standardowe luki są niedozwolone. Jeśli możliwe jest udostępnienie wersji demo na stronach takich jak http://ideone.com itp., Zrób to, abym mógł zweryfikować :)
To konkurs popularności, więc bądź kreatywny!
Podążając za radami innych, postanawiam uczynić z tego golfa kodowego .
Odpowiedzi:
Rubinowy ≥ 2,0, 101
To rozwiązanie można przetestować tutaj: https://ideone.com/C4PLdE
Zauważ, że rozwiązanie połączone na ideone jest o jeden znak dłuższe (
1.i
zamiast1i
w linii 3). Powodem tego jest to, że ideone obsługuje tylko Ruby 1.9, co nie pozwala na składnię skrótów dla złożonych literałów.źródło
x,y,i=eval"[#{gets}]"
sięeval"x,y,i="+gets
zapisać jakieś znaki.eval
zasady określania zakresu:ruby -e 'eval"x=1";p x'
rzucaNameError
zax
nap x
. Działa, gdy używa się stałych (eval"X,Y,I="+gets
), ale ponieważ modyfikujęi
, wymagałoby to dodatkowych,i=I
aby zapobiec ostrzeżeniom o ponownym zdefiniowaniu stałej. Ale może mówimy o różnych wersjach Ruby?x,y,i=eval"*a="+gets
. Dzięki!JavaScript ( ES6 )
145141127Edycja: Usunięto potrzebę stosowania tablicy translacji przy użyciu metody z rozwiązania C edc65
Niegolfowane / komentowane:
źródło
Java - 327
Z białymi znakami:
Jak zwykle w Javie, około połowa z nich to tylko analiza danych wejściowych i formowanie danych wyjściowych. Logika jest dość prosta.
źródło
JavaScript (E6) 175
Edytować Naprawiono błąd, być może poza wartością zwracaną dla d
139 Logika, 36 I / O
Podstawowe bez golfa
Test Test w konsoli javascript w przeglądarce Firefox. Łatwiej jest przetestować funkcję F, unikając wyskakujących okienek.
Wynik
źródło
C 164
180 186Edytuj Naprawiono format wejściowy i usunięto strchr
Edytuj Usunięto tablicę przesunięć, obliczono za pomocą bitów
Nie golfił
źródło
C, 148
150151Ulepszenie rozwiązania @ edc65, które wykorzystuje moje podejście do nadużywania wartości ASCII.
Konkretnie:
d%8%5
odwzorowuje znakiENWS
do0,1,2,3
odpowiednioc%23
zamienia sięL
w7
,M
w8
iR
w 13. Ponieważd
(zmienna kierunkowa) jest zawsze używana mod 4, to skutecznie powodujeL
dodanie -1 mod 4,M
dodanie 0 mod 4 iR
dodanie 1 mod 4.d&1
wynosi 1 dlaNS
i 0 dlaEW
kierunków.d&2
wynosi 2 dla,WS
a 0 dlaNE
kierunków.~-(d&2)
wynosi 1 dlaWS
i -1 dlaNE
kierunków.c%2
wynosi 1 dlaM
i 0 dlaLR
.źródło
c%(2*(1-(d&2)))
Python 3 (z grafiką żółwia),
251199 bajtówMądrzy pythoniści, proszę, bądźcie delikatni, ponieważ jest to moja pierwsza w historii próba programu napisanego w waszym pięknym języku.
Żółwie na Marsie!
Wyzwanie to całkiem naturalnie odwzorowuje grafikę żółwia w stylu logo, dla której Python ma oczywiście import.
Odczytuje dane wejściowe z dwóch wierszy ze STDIN.
Wynik:
W tym programie szczególnie podoba mi się to, że faktycznie pokazuje graficznie ścieżkę łazika. Dodaj
exitonclick()
na końcu programu, aby wyjście graficzne było wyświetlane, dopóki użytkownik nie kliknie:Jestem prawie pewien, że można znacznie bardziej zagrać w golfa - wszelkie sugestie są mile widziane! Robię to CW, ponieważ mam nadzieję, że społeczność może jeszcze trochę zagrać w golfa.
Zmiany:
źródło
GolfScript,
116 98 88 8471To powinno uzyskać współrzędne oraz instrukcji jako argumenty w następujący sposób:
1 2 'N' 'MRMLM'
. Argumenty są przekształcane w ciąg i są wypychane na stos.Jeśli chcesz to przetestować online, przejdź do web golfscript i wklej średnik, a następnie ciąg znaków z argumentami (np.
;"1 2 'N' 'MRMLM'"
) Przed kodem ( tutaj link z przykładem).Przykłady wyników:
Moje poprzednie próby
84 znaków:
88 znaków:
98 znaków:
116 znaków:
źródło
Delfy (819)
Kiedy zaczynałem, nie był to golf . Będzie edytować później.
Nie można jednak znaleźć kompilatora online.
Nie golfił
źródło
=
? Dlaczego są potrzebne? Także nazwy zmiennych wydają mi się zbyt długieJavaScript (353)
To moja pierwsza prawdziwa próba gry w golfa, wydaje się, że przynajmniej działa!
źródło
var
.Python (263)
Musi być też bardziej elegancki sposób, aby nie potrzebować gałęzi po drugiej.
http://ideone.com/eD0FwD
Dane wejściowe są okropne, chciałem to zrobić,
split(',')
ale natknąłem się na problemy z rzutowaniem między ints a stringami. Idealnie chciałbym również dodać starą pozycję z pozycją ruchomą ... och, to jest teraz golf golfowy. No cóż, zostawię to tutaj, może dać inspirację. Inne pomysły, które miałem, wykorzystywały moduł 4 kierunku po zmapowaniu początkowego namiaru na indeks. Również łączenie tur i przenoszenie tablic na jeden, ponieważ żaden z klawiszy nie koliduje.mimo to skracanie nazw zmiennych i usuwanie spacji to 263:
źródło
Python 2.7 -
197192 bajtyJestem z tego bardzo dumny.
Wyjaśnienie
Najpierw posprzątajmy ten bałagan. W wielu miejscach używałem średników zamiast łamania linii, ponieważ myślę, że to sprawia, że jestem fajny. Tutaj jest normalnie (wciąż jest to 197 bajtów, wcale nie zostało odkryte). Tak, nadal jest średnik, ale ten faktycznie oszczędza bajt.
Zaczynajmy!
Najpierw definiujemy
q
jako ciąg'NESW'
. Używamy go dwa razy później ilen("q='NESW';qq") < len("'NESW''NESW'")
.Tutaj dzielimy pierwszą linię inpupt na każdym przecinku. Nasza współrzędna x jest przechowywana w
x
, yy
i pierwsza litera naszego kierunku wd
.Następnie wykonujemy tylko integry. (Byłem zszokowany, że nie mogłem wymyślić lepszego sposobu na konwersję dwóch ciągów znaków na int. Próbowałem,
x,y=map(int,(x,y))
ale okazało się, że jest dłuższy).Konwertuje to nasz kierunek na liczbę całkowitą. 0 to północ, 1 to wschód, 2 to południe, a 3 to zachód.
Tu zaczyna się zabawa.
Kiedy jedziemy na północ, Y wzrasta o 1. Tak więc słownik przyjmuje 0 i podaje ciąg znaków
'y+'
, dla „wzrost y”. Daje podobne wyniki dla innych kierunków: y lub x, po których następuje + lub -.Wrócimy do tego.
Pozwoliłem sobie nieco na odhaczanie tego.
Dla każdego znaku w drugim wierszu wprowadzania robimy dwie rzeczy. Najpierw ustawiamy zmienną
m
na cokolwiek, co nasz słownik dawał nam dla naszego obecnego kierunku. Nie ma żadnego powodu, dla którego powinniśmy to robić za każdym razem, ale jest to łatwiejsze niż sprawienie, aby stało się to, kiedy jest to potrzebne.Następnie tworzymy listę z trzech elementów:
'd+'
,'d-'
, im
. UWAGA REDAKTORA: Myślę, że mogę w ogóle uniknąć używania zmiennejm
. Myślę, że mogę po prostu bezpośrednio umieścićv[d]
na liście. Pozwoli mi to zaoszczędzić kilka bajtów, jeśli zadziała, ale nie mam ochoty go testować, dopóki nie skończę tego wyjaśnienia, abyście mogli sobie poradzić.(Tak, zadziałało.)Szukamy bieżącego znaku wejścia w ciągu „RL”.
str.find
zwraca -1, jeśli nie znajdzie znaku, więc konwertuje R na 0, L na 1 i cokolwiek innego na -1. Oczywiście, jedyne inne dane wejściowe, jakie możemy mieć, to M, ale jest mniej znaków, aby działał na wszystko.Używamy tego numeru jako indeksu dla utworzonej przez nas listy. Wskaźniki listy w języku Python zaczynają się na końcu, jeśli są ujemne, więc otrzymujemy pierwszy element, jeśli dane wejściowe to R, drugi jeśli to L, a ostatni jeśli to M. Dla wygody, zamierzam założyć, że zwrócimy się na północ, ale podobna zasada obowiązuje w innych kierunkach.
Możliwe wartości, z którymi pracujemy, to
'd+'
R,'d-'
L i'y+'
M. Następnie dołączamy'=1;d=d%4'
na końcu każdego z nich. Oznacza to, że naszymi możliwymi wartościami są ...To jest poprawny kod Pythona! To prawidłowy kod python, który robi dokładnie to, co chcemy zrobić dla każdego z tych znaków wejściowych! (Ta
d=d%4
część po prostu podtrzymuje nasze wskazówki. Ponownie, nie musisz tego robić za każdym razem, ale jest mniej postaci.)Wszystko, co musimy zrobić, to wykonać kod, który otrzymujemy dla każdego znaku, wydrukować go (konwertując nasz kierunek z powrotem na ciąg znaków) i gotowe!
źródło
C - 350
Zapisz jako
rover.c
:Skompilować:
Przykładowy przebieg:
Ideone
Nie golfowany:
źródło
Haskell - 412 bajtów
Testowane z:
źródło
f=many digit
DUŻO LOL - TAKIE WOWread
wielokrotne użycie zajęło więcej znaków niż użycie parsec ...Bash + coreutils, 159 bajtów
Dane wejściowe są odczytywane z 2 wierszy STDIN.
Wynik:
źródło
PowerShell,
170167166Nie wydaje mi się, aby dalej grać w golfa, co jest nieco zawstydzające. Ale wszystkie oczywiste włamania tak naprawdę tu nie działają.
Nie mogę
iex
wejście ponieważ a)N
,S
,E
iW
musiałby być funkcje, które do pracy (albo będę musiał prefiksu że z$
ib)1,2,N
musiałby analizowaćN
w trybie ekspresji, nie będąc w stanie uruchomić polecenie .switch
Wydaje się być najkrótsza droga robi się ruch. Tabela skrótów z blokami skryptów lub ciągami znaków nie jest krótsza i na każdy inny sposób, poza tymswitch
, że mam narzut jawnej pętli.Nie mogę się tego pozbyć
IndexOf
ponieważ rurociąg z?
jest jeszcze dłuższy.Nie mogę również pozbyć się jawnych typów w początkowej deklaracji, ponieważ mam tam mieszane typy, więc proste
|%{+$_}
nie pomaga, a każda inna opcja jest dłuższa.Czasami nienawidzę obsługi danych wejściowych w PowerShell.
źródło
Python, 135
137138Nadużycia wartości ASCII
L
,M
aR
aby uniknąć używania żadnych instrukcji warunkowych.Wypróbuj w ideone .
źródło
Python 2.7,
170149Rzeczy, które zmieniłem od oryginału:
Alias raw_input, zmieniono słownik v [d], który i tak powinien być listą, na wybór ciągów znaków, zastosowano
%=
.Edycja: używane rozpakowywanie krotek i eval (raw_input ()) == input (), aby zapisać 21 znaków.
Mocno zapożyczony z @undergroundmonorail, ale z wieloma ulepszeniami.
źródło
Bash / SHELF ,
243235„ SHE ll go LF ” to biblioteka golfowa dla Bash, która zawiera kilka przydatnych aliasów. To poprawna odpowiedź, ponieważ biblioteka istniała i była na GitHub przed opublikowaniem wyzwania.
Przepraszam, nie mogę tego zrobić z ideonem.
Jak biegać
To zajmuje pozycję początkową (oddzieloną przecinkami, jak określono; dodaje to wiele znaków do kodu) jako pierwszy argument i instrukcje na standardowym wejściu.
Próbka wyjściowa
Kod
Wyjaśnienie
d
jest dla porównania; zwraca 0, jeśli jego dwa argumenty są równe, a 1 w przeciwnym razie, może mieć powiązane z nim inne polecenia za pomocą&&
i||
.y
jest jaktr
(ale wykonanesed
).Y
przypominased 's/.../.../g'
dwa argumenty.P
jestecho -e -n
;p
jest po prostuecho -e
.Następny kawałek jest głęboko brzydki, z około 145 znakami w jednej linii. Jeśli bieżącym poleceniem jest M, zamień przecinki w $ o na spacje, przekonwertuj na tablicę i zapisz w $ z. Następnie wykonaj blok skrzynki przełączników dla ostatniego elementu $ z (kierunek, w którym wskazuje łazik. Zmień odpowiednio współrzędne, a następnie zamień $ z powrotem na ciąg oddzielony przecinkami i zapisz na $ o.
źródło
shelf.sh
być częścią rozwiązania? Podobnie jak w przypadkurequire
niektórych pakietów w Ruby lubimport
w Pythonie, jeśli ich potrzebujesz.import
PYG piszą z nim program Python lub Rebmu (AFAIK) pisząc z nim programHaskell, 291
Nie byłem pewien, jak elastyczny jest format ciągu wejściowego i wyjściowego, więc upewniłem się, że wygląda dokładnie tak, jak w przykładzie (oczywiście bez podpowiedzi), ale dodało to wiele dodatkowych znaków. Link Ideone
źródło
PHP - 224
Cóż, spróbowałem.
Wprowadź w STDIN, np .:
źródło
Python3 (288)
Implementacja przy użyciu intensywnego użycia trójskładnikowych ifs.
Pominięcie oczywistych pomruków wejściowych, podanie ciągów kierunkowych wartości wewnętrznych mogło mieć korzystny wpływ na rozmiar skryptu. Jednak podejście tutaj jest całkowicie funkcjonalne (tak sądzę)
źródło
Python 3 (143)
http://ideone.com/wYvt7J
Używamy wbudowanego typu liczb zespolonych Pythona do przechowywania pary współrzędnych. Kierunek jest obliczany przez doprowadzenie wyimaginowanej jednostki
1j
do mocyd
, która przechowuje kierunek mod 4. Obracanie odbywa się poprzez zwiększanie lub zmniejszanied
. Wyrażenie'ML'.find(c)
określa kwotę, którą chcemy zmienićd
:1
dlaL
,0
dlaM
i-1
(domyślnie nie znaleziono) dlaR
.Python nie ma krótkiego sposobu na konwersję liczby zespolonej na krotkę, dlatego musimy wykonywać kosztowne połączenia z
.real
i.imag
.źródło