Die Krähe gegen das Taxi


36

Stellen Sie sich vor auf einen Punkt reisen liegend A Meilen entfernt horizontal und B Meilen entfernt vertikal von der aktuellen Position. Oder mit anderen Worten: Reisen von (0, 0)zu Punkt (a, b). Wie weit müssten Sie am Ende reisen? Dies scheint eine einfache Frage zu sein, aber die Antwort hängt davon ab, wen Sie fragen. Wenn Sie eine Krähe sind, und Sie können Reisen in der Luftlinie , die zurückgelegte Strecke nur die ist euklidischen Abstand zu (a, b). Das ist

sqrt(a^2 + b^2)

Aber wenn Sie nur ein langweiliger Mensch sind, möchten Sie nicht wirklich so weit laufen, also müssen Sie ein Taxi nehmen. Die meisten Taxis fahren nicht in gerader Linie in Richtung Ihres Ziels, weil sie im Allgemeinen versuchen, auf den Straßen zu bleiben. Die tatsächliche Entfernung, die Sie am Ende zurücklegen werden, ist also die Summe aus vertikaler und horizontaler Entfernung. Oder die Formel lautet:

abs(a) + abs(b)

Dies wird als Taxidistanz bezeichnet . Dieses Bild zeigt deutlich den Unterschied zwischen den beiden:

Bildbeschreibung hier eingeben

Um dorthin zu reisen, (6, 6)kann eine Krähe einfach auf der grünen Linie fliegen, und dies ergibt eine Entfernung von 6 * sqrt(2)oder ungefähr 8,49. Ein Taxi kann den roten, blauen oder gelben Weg nehmen, aber alle fahren 12.

Dies führt zu der eigentlichen Frage, die ich stelle. Wenn eine Krähe und ein Taxi von Punkt (0, 0)zu Punkt fahren (a, b), wie lange dauert der Weg des Taxis? Oder, in mehr Fachjargon,

Bestimmen Sie bei einem zweidimensionalen Vektor die Differenz zwischen der Norm2 des Vektors und der Norm1 des Vektors.

Sie müssen das kürzestmögliche Programm oder eine Funktion schreiben, um diese Frage zu beantworten. Sie können wählen, ob Sie 'a' und 'b' als zwei separate Eingaben oder als Tupel mit zwei Elementen verwenden möchten. Sie können Eingaben und Ausgaben in jedem vernünftigen Format vornehmen. Wenn die Differenz eine nicht ganzzahlige Zahl ist, müssen Sie auf mindestens zwei Dezimalstellen genau sein.

Sie können immer davon ausgehen, dass 'a' und 'b' ganze Zahlen sind und dass sie nicht beide 0 sind. (Obwohl es möglich ist, dass eine von beiden Null ist.)

Wie üblich gelten Standardlücken und versuchen, Ihr Programm so kurz wie möglich zu halten, gezählt in Bytes.

Ich werde jede Antwort, die eine Erklärung der Funktionsweise des Codes enthält, positiv bewerten und alle coolen Tricks demonstrieren, die zum Speichern von Bytes verwendet werden.

Hier sind einige Beispiele, mit denen Sie Ihren Code testen können:

#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

Viel Spaß beim Golfen! :)


9
Können wir Eingaben als komplexe Zahlen annehmen?
Uriel

Ich denke, der Testfall für 10,10muss 5.86 sein, da es darum geht 5.85786...und Sie den darunter liegenden abgerundet haben.
Numbermaniac

4
Ich las zuerst den Titel als die Kuh gegen das Taxi und hoffte, etwas mit Kollisionsphysik zu finden ...
MooseBoys

Dürfen wir negative Ergebnisse geben?
Adám

@ Adám Nein. (Seit dem Konzept kehren Sie eine Strecke zurück, die immer positiv ist.)
DJMcMayhem

Antworten:


108

Taxi , 7394 3773 Bytes

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.

Probieren Sie es online!

Ingenieur Toast , ein viel erfahrenerer Taxigolfer, beschloss, sich etwas Zeit zu nehmen (wahrscheinlich viel weniger als ich) und mein Taxi-Programm herunterzuspielen, indem er es grundlegend umschrieb. Sie finden meinen alten Antworttext und Links zu meinen alten TIOs im Bearbeitungsverlauf.

Engineer Toasts ungolfed Quadratwurzel-Algorithmus: Probieren Sie es online!

Ungolfed, mit Erklärungen:

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

1
Dies ist wahnsinnig ...
Gryphon - Wiedereinsetzung von Monica

2
@Gryphon die verrückte Sache ist, ich bin 100% sicher, dass ich wie zweitausend Bytes entfernen kann, wenn ich meine Logik überarbeite, während ich nicht halb schlafe
Stephen

4
4 Stunden verdient die +1 an sich!
Shaggy

4
Ich bin mir sicher, dass die Anzahl der Golfer, die die gesamte Erklärung lesen, geringer sein wird als Ihre Bytes: D
Grajdeanu Alex.

1
+1 für-1 is waiting at Starchild Numerology.
Keyu Gan

10

Javascript (ES6), 36 Byte

-1 Byte danke an @dtkaias

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

Beispielcode-Snippet:

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)}`)


ES6 hat nicht **.
Neil

2
Eine wahre ES6 Version würde wahrscheinlich 41 Bytes sein: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil

@ DanEsparza Es war eindeutig zu. Dies ist, was Revisionsverlauf ist für ...
Neil

Warum nicht a=>b=>a+b-Math.hypot(a,b)?
dtkaias

1
Richtig, wie wäre es (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), für 36 Bytes, auch ES6-kompatibel
dtkaias

8

Julia, 20 Bytes

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

Nimmt aund bals Liste.

Julias normzweites Argument ist standardmäßig 2 - daher wäre dies gleichbedeutend mit norm(x, 1) - norm(x, 2).


Ich habe auch darüber nachgedacht, Julia zu benutzen!
8.

Sehr ähnlich der MATLAB-Antwort, die ich gleich posten wollte.
TheIncredibleZ1

6

Java 8, 47 Bytes

Golf gespielt:

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

Dies ist ungefähr so ​​einfach wie es nur geht: Subtrahieren Sie die beiden berechneten Werte, um die Differenz zu ermitteln. Dies verwendet ternäre Logik anstelle vonMath.abs() , um ein Byte pro Auftreten zu speichern. Leider sind die Klammern aus Gründen der Operatorrangfolge erforderlich.

Die Ausgabe ist die von Java double kann. Sie ist auf mehr als zwei Dezimalstellen genau und erfüllt die Genauigkeitsanforderungen der Frage.

Ungolfed:

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);
  }
}

Ausgabe:

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

1
Sie können currying verwenden , um ein Byte zu speichern: a->b->.
Jakob

4

Mathematica, 32 Bytes

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

oder

Mathematica, 31 Bytes

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

oder @Nicht der Vorschlag eines Baumes

Mathematica, 26 Bytes

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

oder @ Alephalphas Vorschlag

Mathematica, 19 Bytes

N[#~Norm~1-Norm@#]&

Gute Arbeit! Sie können ein paar Bytes sparen, indem Sie komplexe Zahlen für den euklidischen Teil verwenden:N[Tr@Abs@{##}-Abs[#+I#2]]&
Kein Baum

2
N[#~Norm~1-Norm@#]&.
Alephalpha

2
@alephalpha #~Norm~1-N@Norm@#&vielleicht?
Martin Ender

4

Dyalog APL, 13 Bytes

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

Probieren Sie es online!

Erklärung (Eingabe X):

+/∘|     - Sum of the element-wise absolute value of X
-        - Minus
.5*⍨+.×⍨ - Euclidean distance = sqrt(X . X)

4

R , 30 Bytes

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

Nimmt vals 1-Spalten-Matrix. normberechnet eine bestimmte Norm einer Matrix, wobei die Standardnorm die L1-Norm (Taxi) und fdie L2-Norm ist ('f' für Frobenius / Euklidisch) ist.

Probieren Sie es online!


Wow, R hat beides eingebaut, schön!
BLT

3

Python 2 , 40 38 Bytes

-2 Bytes dank Vaultah.

Unterhaltsame Tatsache, 11 Bytes dieses Codes wurden gerade aus der Frage kopiert und abgelegt.

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

Probieren Sie es online!


1
Ich war Ninja'd
Mr. Xcoder

@ Mr.Xcoder Ich würde mir darüber keine Sorgen machen, ich werde wahrscheinlich outgolfen. : P
totalhuman

@ Vaultah Oh, guter Punkt. Vielen Dank!
Totalhuman

5
abs(a+b*1j)sollte funktionieren statt(a*a+b*b)**.5
SteamyRoot

3

Japt , 11 9 Bytes

-2 Bytes dank @ETHproductions

Nxa -MhUV

Probieren Sie es online!

Erklärt

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)

Schön, ich denke das ist das erste mal das ich es Mhbenutzt habe. Ich glaube , Sie können verkürzen Ua +Vazu Nxa(Summe der Eingänge, läuft aauf jedem)
ETHproductions

@ETHproductions Oh, richtig, ich habe vergessen, dass die Summe den optionalen Kartenparameter hat. Vielen Dank!
Justin Mariner

Es gibt also * eine Verwendung für Mh!: D Die meisten Methoden in Japt können das, was @ETHproductions als "Auto-Funktion" bezeichnet, als Argument verwenden. Weitere Informationen hierzu finden Sie in diesem Tipp . Und ich werde morgen einen Tipp schreiben Verwenden von Auto-Funktionen mit Array-Reduzierung, um einige interessante Ergebnisse zu erzielen (z. B. rwwird die größte Ganzzahl in einem Array zurückgegeben.)
Shaggy

@Shaggy Danke, ich hatte die Grundidee von "Auto-Funktionen", aber ich wusste nicht, dass es einen Beitrag für Japt-Tipps gibt. Werde auf jeden Fall diesen Beitrag durchsehen.
Justin Mariner

Wir haben noch ein gutes Stück Arbeit mit dieser Frage vor uns. Wenn Sie also etwas haben, von dem Sie glauben, dass es hinzugefügt werden könnte, tun Sie es bitte. Oder wenn Sie eine Frage haben, die Ihrer Meinung nach dazu passt, teilen Sie uns dies in den Kommentaren mit oder besuchen Sie uns im Chatroom .
Shaggy

3

Schema - 58 Bytes.

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))

3
Willkommen bei PPCG!
Martin Ender

Sie können zwei Leerzeichen entfernen - eines zwischen dem defineund dem (und eines zwischen dem )und dem (.
Clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Aaron

(lambda(a b)(...))sollte ausreichen, anstatt es an einen Namen zu binden. Auch (sqrt(* a a b b))würde ein paar Bytes sparen.
Daniel Schepler


3

APL (Dyalog) , 14 Bytes

Argumentiert in der Form xJy, z3J4

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

Probieren Sie es online!

| die Größe von Doc

| die Stärke des Arguments

- Minus

2+/ die paarweise Summe

 von

| die Größen von

9 11.○⊢ der reale und der imaginäre Teil des Arguments. Doc

Ein besonderer Trick beim Golfen war die Verwendung der paarweisen Reduktion ( 2+/), um +/ein No-Op-Left-Argument zu liefern und dabei Klammern zu vermeiden:||-(+/∘|9 11○⊢)


3

J, 13 Bytes

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

Dies ist eine Funktion, die die Koordinaten als Array verwendet, zB:

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

Erläuterung:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square

Gute Verwendung von &.:- mir war die :von Under nicht bewusst .
Jonah


2

TI-Basic (TI-84 Plus CE), 10 Byte

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

Programmieren Sie diese Eingabe als Liste mit zwei Ganzzahlen Ans, z. B. aufrufen mit {3,4}:prgmCROW(durch 3,4die Eingabe ersetzen undCROW den Namen des Programms).

Erläuterung:

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

Das sieht für mich nach 24-26 Bytes aus, je nachdem, wie und $ Ans ^ 2 $ codiert sind. Vielleicht 10 Tastenanschläge , aber das ist nicht dasselbe.
Ray

@Ray TI-Basic ist eine Token-Sprache .
Pizzapants184

Ich kenne mich hauptsächlich mit TI-89 Basic aus, wo das nicht der Fall ist. Einspruch zurückgenommen.
Ray

2

MATL , 8 7 Bytes

|sG2&|-

Probieren Sie es online!

Erläuterung

|    % 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


2

GNU APL 1.2, 24 Bytes

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

∇f Pdeklariert eine Funktion f, die einen Vektor Pmit den Entfernungen als Argument nimmt (zB[3, 4] )

APL verarbeitet Vektoren, +/|Pwendet also den |Operator ( absFunktion) auf jedes Element im Vektor an und wertet dann +jedes Element aus (addieren Sie also alle Elemente). Dies gibt die Taxidistanz an.

P*2 ergibt einen Vektor, der der gleiche ist wie P mit jedem quadrierten Element . +/P*2zu addieren und dann (mit Klammern für den Vorrang, weil APL von rechts nach links ist) *.5, um die Quadratwurzel zu erhalten. Dies gibt die Krähenentfernung.

Fügen Sie ein zusätzliches Paar Klammern für die Taxidistanz hinzu, um den Unterschied zu berechnen.

um die Funktion zu beenden.


1
Können Sie kein anonymes Lambda verwenden? {(+/|⍵)-(+/⍵*2)*.5}?
Adám

@Adám Ich habe nicht viel Erfahrung mit APL und die neueste Version des GNU-Interpreters (1.7) kann nicht auf dem Mac kompiliert werden, daher kann es zu Einschränkungen kommen. Ich versuche es später noch einmal. Danke für den Tipp.
Arc676

Fast alle Funktionen von GNU APL sind auch in Dyalog APL enthalten, das auf dem Mac frei verfügbar ist . Sie können es auch online ausprobieren .
Adám

Besuchen Sie auch den APL-Chatroom , um mehr über APL zu erfahren.
Adám

2

J , 9 8 Bytes

-1 Danke an meinen Kollegen Marshall.

+&|-|@j.

Probieren Sie es online!

Nimmt A als linkes Argument und B als rechtes Argument.

+ die Summe

& von

| die Größen

- Minus

| die Größenordnung

@ von

j.A + B i

Golf-Trick: Kombinieren Sie die Werte zu einer einzigen komplexen Zahl, weil die Diagonale so leicht zu erhalten ist, und halten Sie sie gleichzeitig getrennt, weil die Summe so leicht zu erhalten ist.


2

Add ++ , 59 57 Bytes

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

Probieren Sie es online!

Das hat ewig gedauert, bis ich es gelöst habe. Die endgültige Antwort wird nicht gerundet, da dies in Add ++ nicht möglich ist. So arbeitet das Programm mit den Eingängen -3und -4( ACCist der Akkumulatorwert)

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


1

Excel VBA, 34 Bytes

Anonyme VBE-Direktfensterfunktion, die die Eingabe aus dem Bereich übernimmt [A1:B1]und die Differenz zwischen den euklidischen und Taxicab-Entfernungen zum VBE-Direktfenster ausgibt.

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]

1
Es ist zwei Bytes kürzer, um es direkt in eine Zelle im Blatt =ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Engineer Toast

@EngineerToast, ich dachte, ich hätte bereits meine Google Sheets / Excel-Lösungen erstellt - danke, dass Sie darauf hingewiesen haben
Taylor Scott





1

Ruby (2.0.0 - 2.3.0), 57 Byte

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

Dies setzt voraus, dass Eingaben von ARGV, z

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

Dies fühlt sich wie ein Betrüger an, da Ruby eine mathematische Bibliothek mit ABS- und SQRT-Funktionen enthält (im Gegensatz zu dem Typ, der seine eigenen ABS- und SQRT-Funktionen geschrieben hat, obwohl ich nichts spezielles gesehen habe, das die Verwendung solcher Funktionen verbietet).

Der erste Trick besteht darin, .mapstattdessen .eachein Byte zu speichern, mithilfe der &:symbolNotation einen von uns to_ifür jedes Element im Array ausgeführten Prozess zuzuordnen und x und y durch Mehrfachzuweisung Werte zuzuweisen.

Eine längere Version wäre:

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

(Da map ein Array zurückgibt, ist wahrscheinlich die Mehrfachzuweisung der richtige Weg, dies wirft keine zusätzlichen Parameter weg, aber wir nehmen trotzdem nur zwei Eingaben an.)

Dann habe ich einfach alle Leerzeichen in der Gleichung entfernt.

Hier ist eine längere Version, 84 Bytes

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

Das Ziel hier war, mich nicht zu wiederholen, zB schreiben zu müssen xoderabs zweimal zweimal zu quadrierenx**2 + y**2

Es hat nicht funktioniert.

Aber was interessant ist, ist, dass Puts kein Leerzeichen benötigen. Ich denke, der Lexer ist schlau genug, um das Sonderzeichen zu erkennen und zu wissen, dass es sich um eine spezielle Variable handelt.

injectund reducesind Synonyme, Inject hat eine Signatur von

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

In unserem Fall müssen wir die Initiale auf 0 setzen, dann haben wir unseren Akkumulator (dh: memo = 0) und das Objekt aus jeder Iteration.

Der Nachteil dieser Methode ist, dass sie mehr als zwei Eingaben benötigt und entweder summiert oder quadriert, addiert und dann alle Werte im Array sqrt.

Ich denke - obwohl ich keinen Ruby 2.4.0 zum Testen habe -, dass dies auch funktionieren wird, der bei 72 Bytes ankommt:

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

Die Standardsumme ist 0 und funktioniert, soweit ich das beurteilen kann, genauso wie Einspritzen / Reduzieren.


Der einzige Grund, warum er keine eingebauten Funktionen verwendete, war, dass für diese Sprache keine zur Verfügung standen. Schöne Antwort und willkommen bei PPCG! :)
Conor O'Brien

Willkommen bei PPCG! Das TIO-Portal verfügt über einen funktionierenden Ruby 2.4.0, mit dem Sie Dinge online ausprobieren können. Versuchen Sie es hier
Value Ink

Indem Sie die flexiblen E / A-Anforderungen nutzen, können Sie das Parsen und Putten vermeiden und auf ein Lambda von 35 Byte heruntergolfen .
benj2240

1

Google Sheets, 31 Bytes

Arbeitsblattfunktion, die die Eingabe aus dem Bereich übernimmt [A1:B1]und die Differenz zwischen den euklidischen und den Taxicab-Entfernungen ausgibt

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

Excel, 32 Bytes

Wie oben, jedoch für MS Excel formatiert

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


0

Pip , 15 Bytes

ABa+ABb-RT$+g*g

Übernimmt Eingaben von Befehlszeilenargumenten. Probieren Sie es online!

Erläuterung

Im Pseudocode ist dies abs(a) + abs(b) - sqrt(fold+(g*g)). aund bsind die ersten beiden cmdline-Argumente und gdie Liste der cmdline-Argumente (dh argv). Der *Operator vektorisiert, wie viele Pip-Operatoren, und $+g*gist dasselbe wiea*a + b*b . Der Rest ist ziemlich unkompliziert.

Leider kann ich mit keine Bytes speichern $+ABg, da der Vorrang von Operatoren mit fold noch nicht so funktioniert, wie er sollte. $+sollte eine etwas höhere Priorität haben als binär -, wird aber im Moment als analysiert $+(ABg-RT$+g*g)und gibt die falsche Antwort. Wenn Sie ($+ABg)-RT$+g*gdies tun , werden keine Bytes über der oben genannten, weniger verschleierten Version gespeichert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.