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:
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! :)
10,10
muss 5.86 sein, da es darum geht5.85786...
und Sie den darunter liegenden abgerundet haben.Antworten:
Taxi ,
73943773 BytesProbieren 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:
quelle
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 Byte
-1 Byte danke an @dtkaias
Beispielcode-Snippet:
quelle
**
.(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)
, für 36 Bytes, auch ES6-kompatibelJulia, 20 Bytes
Nimmt
a
undb
als Liste.Julias
norm
zweites Argument ist standardmäßig 2 - daher wäre dies gleichbedeutend mitnorm(x, 1) - norm(x, 2)
.quelle
Java 8, 47 Bytes
Golf gespielt:
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 von
Math.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:
Ausgabe:
quelle
a->b->
.Mathematica, 32 Bytes
oder
Mathematica, 31 Bytes
oder @Nicht der Vorschlag eines Baumes
Mathematica, 26 Bytes
oder @ Alephalphas Vorschlag
Mathematica, 19 Bytes
quelle
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
vielleicht?Dyalog APL, 13 Bytes
Probieren Sie es online!
Erklärung (Eingabe X):
quelle
R , 30 Bytes
Nimmt
v
als 1-Spalten-Matrix.norm
berechnet eine bestimmte Norm einer Matrix, wobei die Standardnorm die L1-Norm (Taxi) undf
die L2-Norm ist ('f'
für Frobenius / Euklidisch) ist.Probieren Sie es online!
quelle
Python 2 ,
4038 Bytes-2 Bytes dank Vaultah.
Unterhaltsame Tatsache, 11 Bytes dieses Codes wurden gerade aus der Frage kopiert und abgelegt.
Probieren Sie es online!
quelle
abs(a+b*1j)
sollte funktionieren statt(a*a+b*b)**.5
Japt ,
119 Bytes-2 Bytes dank @ETHproductions
Probieren Sie es online!
Erklärt
quelle
Mh
benutzt habe. Ich glaube , Sie können verkürzenUa +Va
zuNxa
(Summe der Eingänge, läufta
auf jedem)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.rw
wird die größte Ganzzahl in einem Array zurückgegeben.)Schema - 58 Bytes.
quelle
define
und dem(
und eines zwischen dem)
und dem(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(lambda(a b)(...))
sollte ausreichen, anstatt es an einen Namen zu binden. Auch(sqrt(* a a b b))
würde ein paar Bytes sparen.Pyth, 8 Bytes
Probieren Sie es online aus. Testsuite.
Erläuterung
quelle
APL (Dyalog) , 14 Bytes
Argumentiert in der Form
xJy
, z3J4
Probieren Sie es online!
|
die Größe von Doc|
die Stärke des Arguments-
Minus2+/
die paarweise Summe∘
von|
die Größen von9 11.○⊢
der reale und der imaginäre Teil des Arguments. DocEin 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○⊢)
quelle
J, 13 Bytes
Dies ist eine Funktion, die die Koordinaten als Array verwendet, zB:
Erläuterung:
quelle
&.:
- mir war die:
von Under nicht bewusst .05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
TI-Basic (TI-84 Plus CE), 10 Byte
Programmieren Sie diese Eingabe als Liste mit zwei Ganzzahlen
Ans
, z. B. aufrufen mit{3,4}:prgmCROW
(durch3,4
die Eingabe ersetzen undCROW
den Namen des Programms).Erläuterung:
quelle
√
und $ Ans ^ 2 $ codiert sind. Vielleicht 10 Tastenanschläge , aber das ist nicht dasselbe.MATL ,
87 BytesProbieren Sie es online!
Erläuterung
quelle
Common Lisp, 57 Bytes
Probieren Sie es online!
quelle
GNU APL 1.2, 24 Bytes
∇f P
deklariert eine Funktionf
, die einen VektorP
mit den Entfernungen als Argument nimmt (zB[3, 4]
)APL verarbeitet Vektoren,
+/|P
wendet also den|
Operator (abs
Funktion) 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 wieP
mit jedem quadrierten Element .+/P*2
zu 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.quelle
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 Bytes-1 Danke an meinen Kollegen Marshall.
Probieren Sie es online!
Nimmt A als linkes Argument und B als rechtes Argument.
+
die Summe&
von|
die Größen-
Minus|
die Größenordnung@
vonj.
A + B iGolf-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.
quelle
Add ++ ,
5957 BytesProbieren 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
-3
und-4
(ACC
ist der Akkumulatorwert)quelle
PHP> = 7.1, 54 Bytes
PHP Sandbox Online
PHP , 55 Bytes
Probieren Sie es online!
PHP , 60 Bytes
mit einer Funktion anstelle eines vollständigen Programms
Probieren Sie es online!
quelle
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.quelle
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari / GP , 26 Bytes
Probieren Sie es online!
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Format ist eine Liste von zwei Zahlen.
quelle
,,,, 18 bytes
Im Wesentlichen ein Port meiner Python-Antwort.
quelle
Ruby , 31 Bytes
Erstellt eine komplexe Zahl, mit der die Entfernung berechnet wird.
Probieren Sie es online!
quelle
Ruby (2.0.0 - 2.3.0), 57 Byte
Dies setzt voraus, dass Eingaben von ARGV, z
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,
.map
stattdessen.each
ein Byte zu speichern, mithilfe der&:symbol
Notation einen von unsto_i
für jedes Element im Array ausgeführten Prozess zuzuordnen und x und y durch Mehrfachzuweisung Werte zuzuweisen.Eine längere Version wäre:
(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
Das Ziel hier war, mich nicht zu wiederholen, zB schreiben zu müssen
x
oderabs
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.
inject
undreduce
sind Synonyme, Inject hat eine Signatur vonIn 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:
Die Standardsumme ist 0 und funktioniert, soweit ich das beurteilen kann, genauso wie Einspritzen / Reduzieren.
quelle
Google Sheets, 31 Bytes
Arbeitsblattfunktion, die die Eingabe aus dem Bereich übernimmt
[A1:B1]
und die Differenz zwischen den euklidischen und den Taxicab-Entfernungen ausgibtExcel, 32 Bytes
Wie oben, jedoch für MS Excel formatiert
quelle
Pyth , 7 Bytes
Probieren Sie es hier aus
Pyth ,
2523 BytesDies ist die erste Lösung, meine erste nicht so einfache Pyth-Lösung, und Sie können sehen, wie schlecht ich früher in Pyth Golf gespielt habe :)
Probieren Sie es online!
quelle
Pip , 15 Bytes
Übernimmt Eingaben von Befehlszeilenargumenten. Probieren Sie es online!
Erläuterung
Im Pseudocode ist dies
abs(a) + abs(b) - sqrt(fold+(g*g))
.a
undb
sind die ersten beiden cmdline-Argumente undg
die Liste der cmdline-Argumente (dh argv). Der*
Operator vektorisiert, wie viele Pip-Operatoren, und$+g*g
ist 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*g
dies tun , werden keine Bytes über der oben genannten, weniger verschleierten Version gespeichert.quelle