Wyobraź sobie podróż do punktu leżącego A mil w poziomie i B mil w pionie od aktualnej pozycji. Lub innymi słowy, podróżując od miejsca (0, 0)
do miejsca (a, b)
. Jak daleko byś musiał podróżować? To wydaje się proste pytanie, ale odpowiedź zależy od tego, kogo zapytasz. Jeśli jesteś krukiem i możesz podróżować w linii prostej , odległość do przebycia to tylko euklidesowa odległość do (a, b)
. To jest
sqrt(a^2 + b^2)
Ale jeśli jesteś nudnym człowiekiem, tak naprawdę nie chcesz iść tak daleko, więc musisz wziąć taksówkę. Większość taksówek nie jedzie prosto do celu, ponieważ zazwyczaj starają się pozostać na drodze. Rzeczywista odległość, którą ostatecznie przejedziesz, to suma odległości pionowej i poziomej. Lub wzór jest następujący:
abs(a) + abs(b)
Nazywa się to Taksówką . To zdjęcie ładnie pokazuje różnicę między nimi:
Aby się do (6, 6)
niego dostać, wrona może po prostu latać na zielonej linii, co daje dystans 6 * sqrt(2)
około 8,49. Taksówka może podążać czerwoną, niebieską lub żółtą ścieżką, ale wszystkie zajmą 12.
To prowadzi do prawdziwego pytania, które zadaję. Jeśli zarówno wrona, jak i taksówka odjeżdżają z punktu (0, 0)
i podróżują do punktu (a, b)
, to o ile dłużej trwa ścieżka taksówki? Lub, bardziej żargon matematyczny,
Biorąc pod uwagę wektor dwuwymiarowy, określ różnicę między norm2 wektora a norm1 wektora.
Musisz napisać możliwie najkrótszy program lub funkcję, aby odpowiedzieć na to pytanie. Możesz wybrać „a” i „b” jako dwa osobne dane wejściowe lub jako krotkę z dwoma przedmiotami. Możesz pobierać dane wejściowe i wyjściowe w dowolnym rozsądnym formacie. Jeśli różnica nie jest liczbą całkowitą, musisz być dokładny co najmniej do dwóch miejsc po przecinku.
Zawsze możesz założyć, że „a” i „b” będą liczbami całkowitymi, i że oba nie będą wynosić 0. (Chociaż możliwe jest, że jedna z nich będzie zero)
Jak zwykle obowiązują standardowe luki i staraj się, aby twój program był jak najkrótszy, liczony w bajtach.
Będę głosować za każdą odpowiedzią, która opublikuje wyjaśnienie, jak działa kod, i pokażę wszystkie fajne sztuczki używane do oszczędzania bajtów.
Oto kilka przykładów przetestowania kodu:
#input #output
3, 4 2
-3, 4 2
-3, -4 2
6, 6 3.51
42, 0 0
10, 10 5.86
3, 3 1.76
Miłej zabawy w golfa! :)
10,10
musi być 5,86, ponieważ wychodzi5.85786...
i zaokrągliłeś ten poniżej.Odpowiedzi:
Taxi ,
73943773 bajtówWypróbuj online!
Inżynier Toast , znacznie bardziej doświadczony golfista Taxi, postanowił poświęcić trochę czasu (prawdopodobnie dużo mniej niż ja) i pograć w golfa z moim programem Taxi, w zasadzie przepisując go. Możesz znaleźć moją starą treść odpowiedzi i linki do moich starych TIO w historii edycji.
Algorytm nieokreślonego pierwiastka kwadratowego inżyniera Toasta: wypróbuj online!
Bez golfa, z wyjaśnieniami:
źródło
-1 is waiting at Starchild Numerology.
JavaScript (ES6), 36 bajtów
-1 bajt dzięki @dtkaias
Przykładowy fragment kodu:
źródło
**
.(x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)
.a=>b=>a+b-Math.hypot(a,b)
?(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)
Julia, 20 bajtów
Trwa
a
ib
jako listę.norm
Drugi argument Julii przyjmuje wartość domyślną 2 - stąd byłby to odpowiedniknorm(x, 1) - norm(x, 2)
.źródło
Java 8, 47 bajtów
Gra w golfa:
Jest to tak proste, jak to możliwe: odejmij dwie obliczone wartości, aby znaleźć różnicę. Wykorzystuje logikę trójskładnikową zamiast
Math.abs()
zapisywać jeden bajt dla każdego wystąpienia. Niestety nawiasy są wymagane ze względu na pierwszeństwo operatora.Wynikiem jest dowolna Java
double
może pomieścić , które jest dokładne z dokładnością do dwóch miejsc po przecinku i spełnia wymagania dokładności pytania.Nie golfowany:
Wydajność:
źródło
a->b->
.Mathematica, 32 bajty
lub
Mathematica, 31 bajtów
lub @Brak sugestii drzewa
Mathematica, 26 bajtów
lub sugestia @ alephalpha
Mathematica, 19 bajtów
źródło
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
może?Dyalog APL, 13 bajtów
Wypróbuj online!
Objaśnienie (wejście X):
źródło
R , 30 bajtów
Przyjmuje się
v
jako macierz 1-kolumnową.norm
oblicza określoną normę macierzy, przy czym domyślną wartością jest norma L1 (taksówka) if
norma L2 ('f'
dla Frobenius / Euclidean).Wypróbuj online!
źródło
Python 2 ,
4038 bajtów-2 bajty dzięki vaultah.
Zabawne jest to, że 11 bajtów tego kodu zostało właśnie skopiowanych z pytania i grało w golfa.
Wypróbuj online!
źródło
abs(a+b*1j)
powinien działać zamiast(a*a+b*b)**.5
Japt ,
119 bajtów-2 bajty dzięki @ETHproductions
Wypróbuj online!
Wyjaśnił
źródło
Mh
. Wierzę, że można skrócićUa +Va
doNxa
(suma nakładów, działającycha
na każdym)Mh
!: D Większość metod w Japt może przyjmować argument, który @ETHproductions nazywa „automatyczną funkcją” jako argument. Zobacz ten poradnik, aby uzyskać więcej informacji na ten temat. A ja napiszę napiwek jutro korzystanie z funkcji automatycznych z redukcją tablic w celu uzyskania interesujących wyników (np.rw
zwróci największą liczbę całkowitą w tablicy)Schemat - 58 bajtów.
źródło
define
i(
a drugą między)
i(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(lambda(a b)(...))
powinno wystarczyć zamiast wiązania go z nazwą. Ponadto(sqrt(* a a b b))
zaoszczędziłby kilka bajtów.Pyth, 8 bajtów
Wypróbuj online. Zestaw testowy.
Wyjaśnienie
źródło
APL (Dyalog) , 14 bajtów
Przyjmuje argument w formie
xJy
, np3J4
Wypróbuj online!
|
wielkość Doc|
wielkość argumentu-
minus2+/
suma par∘
z|
wielkości9 11.○⊢
argument jest rzeczywisty i urojony.DokSpecjalną sztuczką do gry w golfa było użycie parowania z redukcją (
2+/
) w celu dostarczenia+/
argumentu „brak op”, unikając w ten sposób nawiasów:||-(+/∘|9 11○⊢)
źródło
J, 13 bajtów
Jest to funkcja, która przyjmuje współrzędne jako tablicę, np .:
Wyjaśnienie:
źródło
&.:
- nie wiedziałem:
o Under.05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
TI-Basic (TI-84 Plus CE), 10 bajtów
Zaprogramuj wejście jako listę dwóch liczb całkowitych w
Ans
, np. Wywołaj z{3,4}:prgmCROW
(zamieniając3,4
na wejście iCROW
nazwę programu).Wyjaśnienie:
źródło
√
i $ Ans ^ 2 $ są zakodowane. 10 naciśnięć klawiszy , ale to nie to samo.MATL ,
87 bajtówWypróbuj online!
Wyjaśnienie
źródło
Common Lisp, 57 bajtów
Wypróbuj online!
źródło
GNU APL 1.2, 24 bajty
∇f P
deklaruje funkcję,f
która przyjmujeP
jako argument wektor zawierający odległości (np[3, 4]
)APL działa na wektorach, więc
+/|P
stosuje|
operator (abs
funkcję) do każdego elementu w wektorze, a następnie ocenia+
każdy element (więc dodaj wszystkie elementy). To daje odległość do taksówki.P*2
zwraca wektor, który jest taki sam jakP
każdy z kwadratem każdego elementu.+/P*2
dodać je razem, a następnie (z nawiasami pierwszeństwa, ponieważ APL jest od prawej do lewej),*.5
aby uzyskać pierwiastek kwadratowy. To daje odległość do wrony.Dodaj dodatkową parę nawiasów dla odległości taksówki dla pierwszeństwa i oblicz różnicę.
∇
aby zakończyć funkcję.źródło
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 bajtów-1 dzięki mojemu koledze Marshallowi.
Wypróbuj online!
Traktuje A jako lewy argument, a B jako prawy argument.
+
Suma&
z|
wielkości-
minus|
wielkość@
zj.
A + B iSztuczka golfowa: połącz wartości w jedną liczbę zespoloną, ponieważ przekątna jest łatwa do uzyskania, a jednocześnie zachowując je oddzielnie, ponieważ suma jest łatwa do uzyskania w ten sposób.
źródło
Dodaj ++ ,
5957 bajtówWypróbuj online!
Zajęło mi to wieki do rozwiązania. Nie zaokrągla ostatecznej odpowiedzi, ponieważ nie jest to możliwe w Add ++. Tak działa program z wejściami
-3
i-4
(ACC
jest wartością akumulatora)źródło
PHP> = 7.1, 54 bajty
PHP Sandbox Online
PHP , 55 bajtów
Wypróbuj online!
PHP , 60 bajtów
z funkcją zamiast pełnego programu
Wypróbuj online!
źródło
Excel VBA, 34 bajty
Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu
[A1:B1]
i wyprowadza różnicę między odległościami euklidesowymi i taksówkami do bezpośredniego okna VBE.źródło
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari / GP , 26 bajtów
Wypróbuj online!
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Format to lista dwóch liczb.
źródło
,,,, 18 bajtów
Zasadniczo port mojej odpowiedzi w języku Python.
źródło
Ruby , 31 bajtów
Tworzy liczbę zespoloną do obliczenia odległości.
Wypróbuj online!
źródło
Ruby (2.0.0 - 2.3.0), 57 bajtów
Zakłada to przyjmowanie danych wejściowych z ARGV np
To wydaje się oszustwem, ponieważ Ruby ma bibliotekę matematyczną, która ma funkcje abs i sqrt (w przeciwieństwie do faceta, który napisał własne funkcje abs i sqrt, chociaż nie widziałem niczego specjalnie zabraniającego korzystania z takich funkcji).
Pierwszą sztuczką jest użycie
.map
zamiast tego,.each
która zapisuje bajt, a następnie użycie&:symbol
notacji do przekazania mapy wykonywanego przez nas procto_i
dla każdego elementu w tablicy, i użyj wielokrotnego przypisania, aby przypisać wartości do xiy.Dłuższą wersją byłoby:
(ponieważ mapa zwraca tablicę, prawdopodobnie jest to możliwe dzięki wielokrotnemu przypisaniu, odrzuca to dodatkowe parametry, ale i tak zakładamy, że tylko dwa dane wejściowe)
Następnie usunąłem wszystkie spacje w równaniu.
Oto dłuższa wersja, 84 bajtów
Chodziło tutaj o to, by się nie powtarzać, np. Pisanie
x
lub pisanieabs
dwa razy i moje kwadraty dwukrotniex**2 + y**2
To nie działało.
Ale interesujące jest to, że puts nie potrzebuje spacji, myślę, że lexer jest wystarczająco sprytny, aby zobaczyć specjalny znak i wiedzieć, że jest to specjalny var.
inject
ireduce
są synonimami, inject ma podpisW naszym przypadku musimy ustawić wartość początkową na 0, a następnie mamy akumulator (tj. Memo = 0) i obiekt z każdej iteracji.
Wadą tej metody jest to, że zajmie więcej niż dwa dane wejściowe i będzie sumować lub kwadratować, dodawać, a następnie sqrt wszystkie wartości w tablicy.
I pomyśleć --though nie mam Ruby 2.4.0 do testu z - że to będzie działać, jak również, który znalazł się na 72 bajtów:
Suma domyślnie wynosi 0 i, o ile mogę stwierdzić, działa tak samo jak wstrzykiwanie / zmniejszanie.
źródło
Google Sheets, 31 Bytes
Worksheet function that takes input from range
[A1:B1]
and outputs the difference between the Euclidean and Taxicab distancesExcel, 32 bytes
Same as above but formatted for MS Excel
źródło
Pyth, 7 bytes
Try it here
Pyth,
2523 bytesTHis is the initial solution, my first not-so-trivial Pyth solution and you can see just how bad I used to be at golfing in Pyth :)
Try it online!
źródło
Pip, 15 bytes
Takes input from command-line arguments. Try it online!
Explanation
In pseudocode, this is
abs(a) + abs(b) - sqrt(fold+(g*g))
.a
andb
are the first two cmdline args, andg
is the list of cmdline args (i.e. argv). The*
operator vectorizes, like many Pip operators, so$+g*g
is the same thing asa*a + b*b
. The rest is pretty straightforward.Unfortunately, I can't save any bytes with
$+ABg
, because the precedence of operators with fold doesn't work like it should yet.$+
ought to be slightly higher precedence than binary-
, but at the moment it parses as$+(ABg-RT$+g*g)
, giving the wrong answer. Doing($+ABg)-RT$+g*g
doesn't save any bytes over the less-obfuscated version above.źródło