Wrona kontra taksówka

36

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:

enter image description here

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! :)

DJMcMayhem
źródło
9
czy możemy przyjąć dane wejściowe jako liczbę zespoloną?
Uriel
Myślę, że testem dla 10,10musi być 5,86, ponieważ wychodzi 5.85786...i zaokrągliłeś ten poniżej.
numbermaniac
4
Najpierw przeczytałem tytuł jako Krowa kontra taksówka i miałem nadzieję znaleźć coś związanego z fizyką zderzeń ...
MooseBoys
Czy możemy dać negatywne wyniki?
Adám,
@ Adám Nie. (Ponieważ koncepcyjnie oddajesz dystans, który jest zawsze dodatni)
DJMcMayhem

Odpowiedzi:

108

Taxi , 7394 3773 bajtów

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Multiplication Station.1 is waiting at Starchild Numerology.Go to Starchild Numerology:s 2 l 2 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to The Underground.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Go to The Underground:n 2 r 2 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:s 2 r 1 l 1 l 2 r.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:e 2 r.Pickup a passenger going to Multiplication Station.Go to The Underground:w 1 r 2 r 1 r 2 l.[b]Go to Multiplication Station:s 1 l 1 r.Go to Tom's Trims:s 1 r 3 r.Switch to plan "c" if no one is waiting.Switch to plan "a".[c]Go to Multiplication Station:s 1 l 3 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 r 2 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Multiplication Station.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:w 1 r 2 r 1 r 4 l.Pickup a passenger going to Rob's Rest.Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.Go to Cyclone:s 1 l 1 l 1 l 1 r.Pickup a passenger going to Cyclone.[d]Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Cyclone:s 1 r 2 l 2 r.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.99 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to The Underground.Go to Cyclone:e 1 l 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Trunkers:s 1 l.[f]Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Trunkers.Go to Trunkers:s 1 l.Go to Sunny Skies Park:w 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Go to Zoom Zoom:n.Go to Divide and Conquer:w 1 l 2 r 1 r.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Divide and Conquer.2 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.Go to The Underground:s 1 l 1 r 2 l.Switch to plan "g" if no one is waiting.Pickup a passenger going to The Underground.Go to Trunkers:s 2 r 1 l.Switch to plan "f".[g]Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:s 1 l 1 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Wypró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:

[ Crow vs. Taxi ]


[ GET THE NEGATIVE ABSOLUTE VALUES OF BOTH STDINS ]

[Move the stdin values to Tom's Trims b/c:]
[1) Stdin doesn't count as a passenger waiting]
[2) Checking for no one waiting is shorter that keeping tracker of a count for just 2 iterations OR repeating all the code over again]
Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims:n.

[a]
[Clone the first waiting value]
[If we've already picked up both, move to the next process]
[Switch to plan "c" if no one is waiting.]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 l 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l 1 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Multiplication Station.

[Add one to the value]
1 is waiting at Starchild Numerology.
Go to Starchild Numerology:s 2 l 2 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:w 1 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to The Underground.

[Pick up a clone of that one to feed into Multiplication Station]
Go to Cyclone:n 1 l 1 l.
Pickup a passenger going to Multiplication Station.

[Subtract one and see if that's more than zero]
Go to The Underground:n 2 r 2 r.
Switch to plan "b" if no one is waiting.

[It was more than zero so we make it negative]
[First, though, get rid of the pesky result from The Underground]
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill:s 2 r 1 l 1 l 2 r.
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:e 2 r.
Pickup a passenger going to Multiplication Station.
Go to The Underground:w 1 r 2 r 1 r 2 l.

[b]
[Make sure it's a negative value and leave it at Multiplication Station]
[Either it was already negative OR we now have -1 as a passenger]
Go to Multiplication Station:s 1 l 1 r.

[Get the next stdin unless we've already gotten them both]
Go to Tom's Trims:s 1 r 3 r.
Switch to plan "c" if no one is waiting.
Switch to plan "a".


[ ADD THE TWO NEGATIVES AND INVERT TO GET THE TAXI DISTANCE]

[c]
[Pickup the two negative absolute values and clone them]
Go to Multiplication Station:s 1 l 3 l.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Cyclone.
Go to Cyclone:s 1 r 2 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.

[Add the two clones values to get the negative Taxi distance]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Multiplication Station.

[Invert to get the Taxi distance and store it at Rob's Rest]
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:w 1 r 2 r 1 r 4 l.
Pickup a passenger going to Rob's Rest.
Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.


[ FIND THE CROW DISTANCE ]
[Uses the Babylonian method: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method ]

[Square and Sum the cloned values]
Go to Cyclone:s 1 l 1 l 1 l 1 r.
Pickup a passenger going to Cyclone.
[d]
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:s 1 l 2 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Cyclone:s 1 r 2 l 2 r.
Switch to plan "e" if no one is waiting.
Switch to plan "d".
[e]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Cyclone.

[Pickup our cycle counter]
[It's cheaper to do this than to check each iteration's value as equal to the last]
[Taxi can only handle integers up to 2^31-1 so 99 iterations is sufficient.]
99 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to The Underground.

[Duplicate stdin to be stored as S at Trunkers and as x0 at Sunny Skies Park]
[a & b are always integers so Trunkers won't hurt S and it's close with a short name so it's good for golfing]
Go to Cyclone:e 1 l 2 r.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:n 1 r.
Go to Trunkers:s 1 l.

[ This is our starting position for square root:           ]
[  • x at Sunny Skies Park                                 ]
[  • S at Trunkers                                         ]
[  • Taxi at Trunkers                                      ]
[  • The iterator as a passenger going to The Underground  ]

[f]

[Duplicate S so we don't lose it]
Pickup a passenger going to Cyclone.
Go to Cyclone:w 2 r.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Trunkers.
Go to Trunkers:s 1 l.

[Diplicate x for division and addition]
Go to Sunny Skies Park:w 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l.
Pickup a passenger going to Divide and Conquer.

[Gas will be super important in this loop]
Go to Zoom Zoom:n.

[Perform (x + S/x)/2]
[(/2) turns out to be a few bytes shorter than (*.5), mostly due to place names]
Go to Divide and Conquer:w 1 l 2 r 1 r.
Pickup a passenger going to Addition Alley.
Go to Cyclone:e 1 l 1 l 2 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Divide and Conquer.
2 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.
[Now we have the next iteration of x]

[Check the iterator]
Go to The Underground:s 1 l 1 r 2 l.
Switch to plan "g" if no one is waiting.
Pickup a passenger going to The Underground.

[Reset the loop]
Go to Trunkers:s 2 r 1 l.
Switch to plan "f".


[ ADD THE NEGATIVE SUM TO THE SQUARE ROOT TO GET THE NEGATIVE DIFFERENCE ]

[g]
Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.
Pickup a passenger going to What's The Difference.
Go to Sunny Skies Park:s 1 l 1 l.
Pickup a passenger going to What's The Difference.
Go to What's The Difference:n 1 r 1 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:e 3 r.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 l 1 r.
Stephen
źródło
1
To szaleństwo ...
Gryphon - Przywróć Monikę
2
@Gryphon, ta szalona rzecz jest taka, że ​​jestem w 100% pewien, że uda mi się usunąć jak dwa tysiące bajtów, kiedy ponownie wrócę do mojej logiki, gdy nie jestem w półśnie
Stephen
4
4 godziny zasługują na samą +1!
Kudłaty
4
Jestem pewien, że liczba golfistów, którzy przeczytają całe wyjaśnienie, będzie mniejsza niż twoje bajty: D
Grajdeanu Alex.
1
+1 za-1 is waiting at Starchild Numerology.
Keyu Gan
10

JavaScript (ES6), 36 bajtów

-1 bajt dzięki @dtkaias

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

Przykładowy fragment kodu:

f=

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

for(i=0;i<7;i++)
  a=[3,-3,-3,6,42,10,3][i],
  b=[4,4,-4,6,0,10,3][i],
  console.log(`f(${a},${b}) = ${f(a,b)}`)

Herman L.
źródło
ES6 nie ma **.
Neil,
2
Prawdziwa wersja ES6 będzie prawdopodobnie 41 bajtów: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil
@DanEsparza Wyraźnie kiedyś. Tak właśnie wygląda historia zmian ...
Neil
Dlaczego nie a=>b=>a+b-Math.hypot(a,b)?
dtkaias
1
(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)
No
8

Julia, 20 bajtów

x->norm(x,1)-norm(x)

Trwa a i bjako listę.

normDrugi argument Julii przyjmuje wartość domyślną 2 - stąd byłby to odpowiednik norm(x, 1) - norm(x, 2).

Uriel
źródło
Myślałem też o użyciu Julii!
enedil
Bardzo podobny do odpowiedzi MATLAB, którą miałem zamiar opublikować.
TheIncredibleZ1
6

Java 8, 47 bajtów

Gra w golfa:

(a,b)->(a<0?-a:a)+(b<0?-b:b)-Math.sqrt(a*a+b*b)

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:

public class TheCrowVsTheTaxicab {

  public static void main(String[] args) {
    int[][] inputs = new int[][] { { 3, 4 }, { -3, 4 }, { -3, -4 }, { 6, 6, }, { 42, 0 }, { 10, 10 }, { 3, 3 } };
    double[] outputs = new double[] { 2, 2, 2, 3.51, 0, 5.85, 1.76 };

    for (int i = 0; i < inputs.length; ++i) {
      double actual =
        f((a, b) -> (a < 0 ? -a : a) + (b < 0 ? -b : b) - Math.sqrt(a * a + b * b), inputs[i][0], inputs[i][1]);

      System.out.println("Input:    " + inputs[i][0] + ", " + inputs[i][1]);
      System.out.println("Expected: " + outputs[i]);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }
  }

  private static double f(java.util.function.BiFunction<Integer, Integer, Double> f, int a, int b) {
    return f.apply(a, b);
  }
}

Wydajność:

Input:    3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, -4
Expected: 2.0
Actual:   2.0

Input:    6, 6
Expected: 3.51
Actual:   3.5147186257614305

Input:    42, 0
Expected: 0.0
Actual:   0.0

Input:    10, 10
Expected: 5.85
Actual:   5.857864376269049

Input:    3, 3
Expected: 1.76
Actual:   1.7573593128807152
Khaled.K
źródło
1
Można użyć currying zapisać bajt: a->b->.
Jakob
4

Mathematica, 32 bajty

N[Tr@Abs[a={##1}]-Sqrt@Tr[a^2]]&

lub

Mathematica, 31 bajtów

N[Abs@#+Abs@#2-Sqrt[#^2+#2^2]]&

lub @Brak sugestii drzewa

Mathematica, 26 bajtów

N[Tr@Abs@{##}-Abs[#+I#2]]&

lub sugestia @ alephalpha

Mathematica, 19 bajtów

N[#~Norm~1-Norm@#]&
J42161217
źródło
Dobra robota! Możesz zaoszczędzić kilka bajtów, używając liczb zespolonych dla części euklidesowej:N[Tr@Abs@{##}-Abs[#+I#2]]&
To nie drzewo,
2
N[#~Norm~1-Norm@#]&.
alephalpha
2
@alephalpha #~Norm~1-N@Norm@#&może?
Martin Ender
4

Dyalog APL, 13 bajtów

+/∘|-.5*⍨+.×⍨

Wypróbuj online!

Objaśnienie (wejście X):

+/∘|     - Sum of the element-wise absolute value of X
-        - Minus
.5*⍨+.×⍨ - Euclidean distance = sqrt(X . X)
Zacharý
źródło
4

R , 30 bajtów

function(v)norm(v)-norm(v,'f')

Przyjmuje się vjako macierz 1-kolumnową. normoblicza określoną normę macierzy, przy czym domyślną wartością jest norma L1 (taksówka) i fnorma L2 ( 'f'dla Frobenius / Euclidean).

Wypróbuj online!

Giuseppe
źródło
Wow, R ma oba wbudowane, fajnie!
BLT
3

Python 2 , 40 38 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.

lambda a,b:abs(a)+abs(b)-(a*a+b*b)**.5

Wypróbuj online!

całkowicie ludzki
źródło
1
Zostałem ninja'd
Mr. Xcoder
@ Mr.Xcoder Nie martwiłbym się tym zbytnio, prawdopodobnie nie będę grał w golfa. : P
totalnie ludzki,
@vaultah Oh, dobra uwaga. Dzięki!
całkowicie ludzki,
5
abs(a+b*1j)powinien działać zamiast(a*a+b*b)**.5
SteamyRoot
3

Japt , 11 9 bajtów

-2 bajty dzięki @ETHproductions

Nxa -MhUV

Wypróbuj online!

Wyjaśnił

Nxa -MhUV   // implicit: U and V are input integers, N = [U,V]

N a         // get absolute value of both inputs
 x          // sum those values
    -MhUV   // subtract hypot(U, V) -> sqrt(U^2 + V^2)
Justin Mariner
źródło
Fajnie, myślę, że to pierwszy raz, kiedy widziałem Mh. Wierzę, że można skrócić Ua +Vado Nxa(suma nakładów, działających ana każdym)
ETHproductions
@ETHproductions No tak, zapomniałem, że ta suma ma opcjonalny parametr mapy. Dzięki!
Justin Mariner
Jest więc * zastosowanie 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. rwzwróci największą liczbę całkowitą w tablicy)
Shaggy
@Shaggy Dzięki, miałem podstawową ideę „funkcji automatycznych”, ale nie zdawałem sobie sprawy, że jest post dla wskazówek Japt. Na pewno przejrzę ten post.
Justin Mariner,
Nadal mamy wiele do zrobienia w związku z tym pytaniem, więc jeśli masz coś, co Twoim zdaniem może zostać dodane, zrób to. Lub jeśli masz pytanie, które według Ciebie pasuje, daj nam znać w komentarzach lub dołącz do nas na czacie .
Kudłaty
3

Schemat - 58 bajtów.

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))
GenRincewind
źródło
3
Witamy w PPCG!
Martin Ender
Możesz usunąć dwie spacje - jedną między definei (a drugą między )i (.
clismique
Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Aaron,
(lambda(a b)(...))powinno wystarczyć zamiast wiązania go z nazwą. Ponadto (sqrt(* a a b b))zaoszczędziłby kilka bajtów.
Daniel Schepler
3

Pyth, 8 bajtów

-s.aMQ.a

Wypróbuj online. Zestaw testowy.

Wyjaśnienie

-s.aMQ.aQ      Q (input) appended implicitly
  .aMQ         absolute values of input vector
 s             sum
-              subtract
      .aQ      norm2 of input vector
PurkkaKoodari
źródło
3

APL (Dyalog) , 14 bajtów

Przyjmuje argument w formie xJy, np3J4

||-2+/∘|9 11○⊢

Wypróbuj online!

| wielkość Doc

| wielkość argumentu

- minus

2+/ suma par

 z

| wielkości

9 11.○⊢ argument jest rzeczywisty i urojony.Dok

Specjalną 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○⊢)

Adám
źródło
3

J, 13 bajtów

+/@:|-+/&.:*:

Jest to funkcja, która przyjmuje współrzędne jako tablicę, np .:

   (+/@:|-+/&.:*:) _3 4
2

Wyjaśnienie:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square
marinus
źródło
Niezłe użycie &.:- nie wiedziałem :o Under.
Jonasz
2

05AB1E , 7 bajtów

ÄO¹nOt-

Wypróbuj online!

Wyjaśnienie

Ä        # absolute value of inputs
 O       # sum
  ¹      # push input again
   n     # square
    O    # sum
     t   # sqrt
      -  # subtract
Emigna
źródło
2

TI-Basic (TI-84 Plus CE), 10 bajtów

sum(abs(Ans))-√(sum(Ans2

Zaprogramuj wejście jako listę dwóch liczb całkowitych w Ans, np. Wywołaj z {3,4}:prgmCROW(zamieniając 3,4na wejście i CROWnazwę programu).

Wyjaśnienie:

sum(abs(Ans))-√(sum(Ans2
        Ans               # The input list of two integers
    abs(   )              # Absolute value of each item in the list
sum(        )             # Sum of the list
                    Ans   # The input list of two integers
                       2  # Square of each item in the list
                sum(      # Sum of the list
              √(          # Square root of the sum
             -            # Difference of the two values
pizzapanty184
źródło
Dla mnie wygląda to na 24-26 bajtów, w zależności od tego, jak i $ Ans ^ 2 $ są zakodowane. 10 naciśnięć klawiszy , ale to nie to samo.
Ray
@Ray TI-Basic to tokenizowany język .
pizzapants184
Najbardziej znam TI-89 Basic, gdzie tak nie jest. Sprzeciw wycofany.
Ray
2

MATL , 8 7 bajtów

|sG2&|-

Wypróbuj online!

Wyjaśnienie

|    % Implicit input: vector of two numbers. Absolute value, element-wise
s    % Sum of vector
G    % Push input again
2    % Push 2
&|   % 2-norm of input
-    % Subtract. Implicit display
Luis Mendo
źródło
2

GNU APL 1.2, 24 bajty

∇f P
(+/|P)-(+/P*2)*.5
∇

∇f Pdeklaruje funkcję, fktóra przyjmuje Pjako argument wektor zawierający odległości (np[3, 4] )

APL działa na wektorach, więc +/|Pstosuje |operator ( absfunkcję) 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*2zwraca wektor, który jest taki sam jak Pkażdy z kwadratem każdego elementu. +/P*2dodać je razem, a następnie (z nawiasami pierwszeństwa, ponieważ APL jest od prawej do lewej), *.5aby 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ę.

Arc676
źródło
1
Nie możesz użyć anonimowej lambdy? {(+/|⍵)-(+/⍵*2)*.5}?
Adám
@ Adám Nie mam dużego doświadczenia z APL, a najnowsza wersja interpretera GNU (1.7) nie kompiluje się na Macu, więc mogą być pewne ograniczenia. Spróbuję później sprawdzić, czy to działa. Dzięki za wskazówkę.
Arc676,
Prawie wszystkie funkcje GNU APL są również dostępne w Dyalog APL, który jest dostępny bezpłatnie na Macu . Możesz także spróbować online .
Adám
Dołącz również do czatu APL, aby dowiedzieć się więcej o APL.
Adám
2

J , 9 8 bajtów

-1 dzięki mojemu koledze Marshallowi.

+&|-|@j.

Wypróbuj online!

Traktuje A jako lewy argument, a B jako prawy argument.

+ Suma

& z

| wielkości

- minus

| wielkość

@ z

j.A + B i

Sztuczka 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.

Adám
źródło
2

Dodaj ++ , 59 57 bajtów

D,f,@@,|@|+
D,g,@@,d*@d*+
_
$f>G>G
V
$g>?>?
S
-G
$f>x>0
O

Wypró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 -3i -4( ACCjest wartością akumulatora)

D,        Define a function
  f,      called f
  @@,     that takes 2 arguments (e.g. -3, -4)
     |    absolute value;   STACK = [-3, 4]
     @    reverse stack;    STACK = [4, -3]
     |    absolute value;   STACK = [4, 3]
     +    sum;              STACK = [7]
          implicitly return the top of the stack

D,        Define a function
  g,      called g
  @@,     that takes 2 arguments (e.g. -3, -4)
     d    duplicate;  STACK = [-3, -4, -4]
     *    multiply;   STACK = [-3, 16]
     @    reverse;    STACK = [16, -3]
     d    duplicate;  STACK = [16, -3, -3]
     *    multiply;   STACK = [16, 9]
     +    sum;        STACK = [25]
          implicitly return the top of the stack

_         store the inputs in the second stack;  ACC = 0;  STACK = [-3, -4]
$f>G>G    apply f with -3 and -4 as arguments;   ACC = 7;  STACK = []
V         store ACC in the stack;                ACC = 7;  STACK = [7]
$g>?>?    apply g with -3 and -4 as arguments;   ACC = 25; STACK = [7]
S         square root the ACC;                   ACC = 5;  STACK = [7]
-G        subtract the stack value from the ACC; ACC = -2; STACK = []
$f>x>0    apply f with ACC and 0 as arguments;   ACC = 2;  STACK = []
O         output ACC as a number
Cairney Coheringaahing
źródło
1

PHP> = 7.1, 54 bajty

[,$x,$y]=$argv;echo abs($x)+abs($y)-sqrt($x**2+$y**2);

PHP Sandbox Online

PHP , 55 bajtów

<?=abs($x=$argv[1])+abs($y=$argv[2])-sqrt($x**2+$y**2);

Wypróbuj online!

PHP , 60 bajtów

z funkcją zamiast pełnego programu

function f($x,$y){return abs($x)+abs($y)-sqrt($x**2+$y**2);}

Wypróbuj online!

Jörg Hülsermann
źródło
1

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.

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]
Taylor Scott
źródło
1
Jest o dwa bajty krótszy, aby umieścić go bezpośrednio w komórce w arkuszu:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Toast Engineer
@EngineerToast, myślałem, że już wystawiłem swoje Arkusze Google / Excel Solutions - dzięki za zwrócenie na to uwagi
Taylor Scott
1

,,,, 18 bajtów

Zasadniczo port mojej odpowiedzi w języku Python.

a:↔a:0•2*⇆2*+√↔+↔-
całkowicie ludzki
źródło
1

Ruby , 31 bajtów

Tworzy liczbę zespoloną do obliczenia odległości.

->x,y{x.abs+y.abs-(x+y*1i).abs}

Wypróbuj online!

Wartość tuszu
źródło
1

Ruby (2.0.0 - 2.3.0), 57 bajtów

x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)

Zakłada to przyjmowanie danych wejściowych z ARGV np

ruby -e 'x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)' -- -3 4

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 .mapzamiast tego, .eachktóra zapisuje bajt, a następnie użycie &:symbolnotacji 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:

(x, y) = ARGV.map{ |string| string.to_i }

(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

$*.map!(&:to_i);puts$*.inject(0){|x,y|x+y.abs}-Math.sqrt($*.inject(0){|x,y|x+y**2})

Chodziło tutaj o to, by się nie powtarzać, np. Pisanie xlub pisanie absdwa 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.

injecti reducesą synonimami, inject ma podpis

inject(initial) {| memo, obj | block }

W 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:

$*.map!(&:to_i);puts$*.sub{|x,y|x+y.abs}-Math.sqrt($*.sum{|x,y|x+y**2})

Suma domyślnie wynosi 0 i, o ile mogę stwierdzić, działa tak samo jak wstrzykiwanie / zmniejszanie.

qubitrenegade
źródło
Jedynym powodem, dla którego nie używał wbudowanych funkcji, było to, że ten język nie miał dla niego żadnego dostępnego. Ładna odpowiedź i witamy w PPCG! :)
Conor O'Brien
Witamy w PPCG! Portal TIO ma działający Ruby 2.4.0, którego możesz użyć do wypróbowania rzeczy online. Spróbuj tutaj
Value Ink
Taking advantage of the flexible i/o requirements, you could avoid parsing and puts-ing, golfing down to a 35-byte lambda.
benj2240
1

Google Sheets, 31 Bytes

Worksheet function that takes input from range [A1:B1] and outputs the difference between the Euclidean and Taxicab distances

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2

Excel, 32 bytes

Same as above but formatted for MS Excel

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Taylor Scott
źródło
1

Pyth, 7 bytes

a.aQsa0

Try it here


Pyth,  25  23 bytes

THis 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 :)

K.aswJ.asw-+KJ^+^K2^J2 .5

Try it online!

Mr. Xcoder
źródło
0

Pip, 15 bytes

ABa+ABb-RT$+g*g

Takes input from command-line arguments. Try it online!

Explanation

In pseudocode, this is abs(a) + abs(b) - sqrt(fold+(g*g)). a and b are the first two cmdline args, and g is the list of cmdline args (i.e. argv). The * operator vectorizes, like many Pip operators, so $+g*g is the same thing as a*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.

DLosc
źródło