Niepotrzebna i skomplikowana historia
Chodzę po Manhattanie, blok po bloku, a moje stopy są zmęczone i chcę wracać do domu.
Ruch uliczny jest dość duży, ale na szczęście jestem bardzo bogaty i mam w hotelu helikopter w gotowości. Ale potrzebuję, aby wiedzieli, ile paliwa trzeba spakować na lot, i dlatego muszą znać moją bezpośrednią odległość od hotelu. Pamiętałem, które bloki przeszedłem i mogę im powiedzieć, jaką trasę wybrałem. Odległość ta musi być jednak precyzyjna, jeśli są zbyt krótkie, nie wrócimy zbyt długo i kupiłem paliwo, którego nie mogę użyć.
Czy możesz napisać mi program, który przeliczy to na odległość, którą będą musieli pokonać podczas lotu, aby mnie zabrać?
Specyfikacja:
Napisz mi funkcję, która:
- Akceptuje listę lub ciąg bloków kroczonych względem dowolnej siatki:
- U p, D own, L eft i R ight.
- Może być wielką lub małą literą - np. jeśli jest krótszy w użyciu
u
zamiastU
iść do przodu. - Nieprawidłowy kierunek ma niezdefiniowane zachowanie - np. kierunek X może spowodować awarię.
- Zwraca liczbę zmiennoprzecinkową / dziesiętną / podwójną, która jest dwukrotnością odległości linii prostej od punktu początkowego.
Dla ilustracji i wyjaśnień:
Moja podróż mogła być równie łatwo nagrana jak "luluu..."
lub, ['l','u','l'...]
ale musi być zapisana jako góra, dół, lewo, prawo.
Odpowiedzi:
J, 17 znaków
Wykorzystuje fakt, że moce
j
reprezentują właściwe kierunki.'urdl'i.
weź ciąg i oblicz wskaźniki (0 dla „u”, 1 dla „r”, ...)0j1^
przekształca się w kierunku w płaszczyźnie złożonej przy użyciu odpowiedniej mocyj
.+/
podsumowuje pojedyncze kroki2*|
dwa razy modułPrzykład:
źródło
Python 2,7
5658565148Dzięki skradzionej dziesiątce grosza od Scrooge McDuck zarobiłem fortunę i mam teraz więcej bogactwa niż Scrooge.
Python 2.7 -
615350 (bez rozróżniania wielkości liter)Realizacja
źródło
IndexError: list index out of range
. Jaką formę powinien mieć wkład?%5
nie%8
. Ok, teraz ma to większy sens :)APL (29)
na przykład
Wyjaśnienie:
+/'URDL'∘.=⍵
: zobacz, jak częstoURDL
występują znaki w argumencie-⌿2 2⍴
: odejmijU
wartość odD
wartości, aR
wartość odL
wartości2 0j2×
: pomnóż wartość pionową przez2
i wartość poziomą przez2i
+/
: suma|
: wielkośćźródło
Rubinowy 1.9+ (67)
Przykład
źródło
perl6: 44 znaków
get.comb
pobiera jeden wiersz danych wejściowych i dzieli się na znaki<U R L D>
to lista słów, w tym przypadku znaków(1,2,3) Z (4,5,6)
==(1,2), (2,5), (3,6)
, więc zamyka między sobą 2 listy, tworząc listę paczek, która%()
zamienia się w skrót<<**>>
robi parami**
, przedłużając krótszą listę, aby pasowała do dłuższej. Krótsza lista zdarza się tylkoi
[+]
sumuje wszystkie elementy listy,abs
przyjmuje moduł dla liczb zespolonychTak, usunąłem wszystkie możliwe spacje.
źródło
Python 2.7 - 65
Przyjemna i krótka, do przejścia przez płaszczyznę używa liczb zespolonych:
Rekwizyty dla DSM i Abhijita w innych pytaniach, które pokazały mi, jak to wykorzystać
1j
do obliczenia tego.źródło
1j
zapisać jakoj
,-1j
as-j
? Ponadto, czy obsługuje to górne i dolne wejście, czy tylko górne?j
a jednostką urojonąj
2
zamiast mnożąc wynik końcowy.Mathematica
9249Calle zasługuje na pełne uznanie za usprawnienie kodu.
Przykład
źródło
f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]
wystarczy.2 Norm[(2. + 2. I) + "U" + "X"]
jako wyjście dla twojego kodu.@
s, otrzymasz kolejne dwa znaki mniej.PHP, 67
Przykład:
źródło
Julia, 45 lat
Ukradł
i
sztuczkę do władzy. Również wszystkie znaki oprócz d mają wartości, które działają jako dopuszczalne moce dlai
.źródło
J, 29 znaków
Działa tylko z niższych kierunkach przypadków i innych niż znaki
r
,u
,l
, id
spowoduje jej dać złą odpowiedź.Stosowanie:
Wyjaśnienie:
'ruld'i.'uuuudrrrl'
Diadadowa formai.
znajduje indeks przedmiotów z prawego argumentu w lewym argumencie. W tym przypadku:/:~
sortuje tę listę w porządku rosnącym:#/.~
zlicza liczbę wystąpień każdej liczby:_2[\
dzieli na 2 rzędy:-/
odejmuje dół od góry+&.*:
zapożycza lewę z innej odpowiedzi J, którą widziałem dziś rano , i podnosi do kwadratu elementy, następnie sumuje je, a następnie wykonuje pierwiastek kwadratowy. Zobacz w&.
dokumentacji:+:
podwaja wynik:źródło
R,
867456 znakówOk, w rzeczywistości jest o wiele krótszy z wyimaginowanymi liczbami:
Stosowanie:
Stare rozwiązanie o długości 74 znaków z współrzędnymi xy:
Stosowanie:
Pobiera dane wejściowe jako standardowe, muszą być małe i oddzielone spacjami. Użyj współrzędnych xy, zaczynając od (0,0).
źródło
k (
5049)Przykład
źródło
Java, 185,
203,204,217,226Zakładałem, że każde „U” to „1 up”, więc dwie jednostki w górę to „UU”
Edycja: zamieniono przełącznik ifs
Przeniesiony do iteratora
Nie przyjmuje już danych wejściowych jako ciągu, a raczej tablicy kierunków
źródło
T-SQL, 158
@S jest łańcuchem wejściowym typu varchar (max)
źródło
ES6,
7769Definicja:
Stosowanie:
(Zainspirowany częściowo odpowiedzią Boanna.)
źródło
for
stwierdzeniem wyrażenie (treść funkcji strzałki zawierająca instrukcje wymaga nawiasów i jawnego zwrotu, ciała, które są tylko wyrażeniami, nie).JavaScript - 142 znaki - bez eval ()
gdzie a jest ciągiem jak „uudrrl”
użyj tego -
Przetestuj w konsoli przeglądarki.
źródło
C # - 90 znaków
Świeży od LINQPad.
Gdzie wejście jest poprawnym ciągiem.
źródło
Befunge-93 (65)
Ma 65 znaków innych niż białe znaki (217 z białymi znakami, choć można to zmniejszyć dzięki bardziej zwartemu układowi (dla znaków 69/176)). Format wyjściowy wymaga pewnej swobody, ale jest niezaprzeczalnie dokładny. Nie wydaje się warte wysiłku, aby wdrożyć / ukraść implementację pierwiastka kwadratowego.
echo 'UUDLLUU' | ./befungee.py ../man
wyjścia 2√13 (w rzeczywistości wydaje się, że problem dotyczy rozszerzonego ASCII).źródło
Matlab, 51 znaków
Moje przesłanie Matlaba działa tylko z listami zastrzeżonymi. To była świetna zabawa! Najtrudniejsze było przekształcenie ciągu znaków na tablicę liczb zespolonych, które należy zsumować.
Funkcjonować:
Stosowanie:
źródło
JavaScript, 136
źródło
JavaScript, 89
Przykład:
źródło
C 120
d("LULUURRRRURD")
->8.485281
źródło
JavaScript (bez ES6, bez eval) - 131
Test:
źródło