Imaginez voyager jusqu'à un point situé A miles de distance horizontalement et B miles à la verticale de votre position actuelle. Ou en d'autres termes, voyager de (0, 0)
point à point (a, b)
. Jusqu'où auriez-vous besoin de finir par voyager? Cela semble être une question simple, mais la réponse dépend de qui vous demandez. Si vous êtes un corbeau, et vous pouvez voyager à vol d'oiseau , la distance parcourue est juste la distance euclidienne à (a, b)
. C'est
sqrt(a^2 + b^2)
Mais si vous êtes juste un humain ennuyeux, vous ne voulez pas vraiment marcher aussi loin, alors vous devrez prendre un taxi. La plupart des taxis ne conduisent pas en ligne droite vers votre destination car ils essaient généralement de rester sur les routes. Ainsi, la distance réelle à parcourir est la somme de la distance verticale et de la distance horizontale. Ou la formule est:
abs(a) + abs(b)
Ceci s'appelle la distance de taxi . Cette image montre bien la différence entre les deux:
Pour voyager (6, 6)
, un corbeau peut simplement voler sur la ligne verte, ce qui donne une distance d' 6 * sqrt(2)
environ 8,49. Un taxi peut emprunter les sentiers rouge, bleu ou jaune, mais ils emprunteront tous 12 km.
Cela conduit à la vraie question que je pose. Si un corbeau et un taxi partent tous deux d'un point (0, 0)
à l'autre (a, b)
, combien de temps leur chemin est-il long? Ou, dans plus de jargon mathématique,
À partir d’un vecteur bidimensionnel, déterminez la différence entre la norme norm2 du vecteur et la norm1 du vecteur.
Vous devez écrire le programme ou la fonction le plus court possible pour répondre à cette question. Vous pouvez choisir de prendre "a" et "b" comme deux entrées séparées ou comme un tuple à deux éléments. Vous pouvez entrer et sortir dans n'importe quel format raisonnable. Si la différence n'est pas un entier, vous devez être précis à au moins deux décimales.
Vous pouvez toujours supposer que 'a' et 'b' seront des entiers et qu'ils ne seront pas tous les deux égaux à 0. (Bien qu'il soit possible que l'un ou l'autre soit égal à zéro)
Comme d'habitude, des failles standard s'appliquent et tentent de rendre votre programme aussi court que possible, compté en octets.
Je vais upvoter toute réponse qui affiche une explication de la façon dont le code fonctionne, et montre toutes les astuces intéressantes utilisées pour économiser des octets.
Voici quelques exemples pour vous permettre de tester votre code sur:
#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
Amusez-vous à jouer au golf! :)
10,10
doit être 5.86, car il vient5.85786...
et vous avez arrondi le test en dessous.Réponses:
Taxi ,
73943773 octetsEssayez-le en ligne!
Engineer Toast , un golfeur de taxi bien plus expérimenté, a décidé de prendre un peu de temps (probablement beaucoup moins que moi) et de jouer au golf dans mon programme de taxi en le réécrivant. Vous pouvez trouver mon ancien corps de réponse et des liens vers mes anciens TIO dans l'historique des modifications.
Algorithme de racine carrée non golfée de Engineer Toast: essayez-le en ligne!
Ungolfed, avec des explications:
la source
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 octets
-1 octet grâce à @dtkaias
Exemple d'extrait de code:
la source
**
.(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)
, pour 36 octets, de la compatibilité ES6 aussiJulia, 20 octets
Prend
a
etb
comme une liste.Le
norm
second argument de Julia vaut 2 par défaut - ce qui équivaut ànorm(x, 1) - norm(x, 2)
.la source
Java 8, 47 octets
Golfé:
C’est à peu près aussi fondamental que cela: soustrayez les deux valeurs calculées pour trouver la différence. Ceci utilise la logique ternaire au lieu de
Math.abs()
sauvegarder un octet à chaque occurrence. Malheureusement, les parenthèses sont obligatoires en raison de la priorité de l'opérateur.La sortie correspond à tout ce que Java
double
peut contenir, ce qui est précis à plus de deux décimales et satisfait à l'exigence de précision de la question.Ungolfed:
Sortie:
la source
a->b->
.Mathematica, 32 octets
ou
Mathematica, 31 octets
ou @Pas la suggestion d'un arbre
Mathematica, 26 octets
ou la suggestion de @ alephalpha
Mathematica, 19 octets
la source
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
peut-être?Dyalog APL, 13 octets
Essayez-le en ligne!
Explication (entrée X):
la source
R , 30 octets
Prend
v
comme une matrice à 1 colonne.norm
calcule une norme particulière d'une matrice, la valeur par défaut étant la norme L1 (taxicab) etf
la norme L2 ('f'
pour Frobenius / Euclidien).Essayez-le en ligne!
la source
Python 2 ,
4038 octets-2 octets grâce à vaultah.
Fait amusant, 11 octets de ce code viennent d'être copiés de la question et joués au golf.
Essayez-le en ligne!
la source
abs(a+b*1j)
devrait fonctionner au lieu de(a*a+b*b)**.5
Japt ,
11 à9 octets-2 octets grâce à @ETHproductions
Essayez-le en ligne!
A expliqué
la source
Mh
utilisé. Je crois que vous pouvez réduireUa +Va
àNxa
(somme des entrées, en cours d' exécutiona
sur chaque)Mh
!: D La plupart des méthodes de Japt peuvent prendre comme argument ce que @ETHproductions appelle une" fonction automatique ". Voir cette astuce pour en savoir plus. Et j'écrirai une astuce demain en utilisant des fonctions automatiques avec réduction de tableau pour obtenir des résultats intéressants (par exemple,rw
renverra le plus grand entier d'un tableau).Schéma - 58 octets.
la source
define
et le(
, et un entre le)
et le(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(lambda(a b)(...))
devrait être suffisant au lieu de le lier à un nom. En outre,(sqrt(* a a b b))
économiser quelques octets.Pyth, 8 octets
Essayez-le en ligne. Suite de tests.
Explication
la source
APL (Dyalog) , 14 octets
Prend argument sous la forme
xJy
, par exemple3J4
Essayez-le en ligne!
|
la magnitude de doc|
la magnitude de l'argument-
moins2+/
la somme par paire∘
de|
les magnitudes de9 11.○⊢
l'argument est réel et les parties imaginaires. DocLe truc spécial pour le golf était l’utilisation de la réduction par paire (
2+/
) pour fournir+/
un argument non-gauche, évitant ainsi les parenthèses:||-(+/∘|9 11○⊢)
la source
J, 13 octets
C'est une fonction qui prend les coordonnées sous forme de tableau, par exemple:
Explication:
la source
&.:
- je n'étais pas au courant de la:
sous.05AB1E , 7 octets
Essayez-le en ligne!
Explication
la source
TI-Basic (TI-84 Plus CE), 10 octets
Programmez cette entrée sous forme de liste de deux entiers
Ans
, par exemple, appelez avec{3,4}:prgmCROW
(remplacez3,4
par l'entrée etCROW
par le nom du programme).Explication:
la source
√
et $ Ans ^ 2 $ sont codés. 10 frappes peut-être, mais ce n'est pas la même chose.MATL ,
87 octetsEssayez-le en ligne!
Explication
la source
Common Lisp, 57 octets
Essayez-le en ligne!
la source
GNU APL 1.2, 24 octets
∇f P
déclare une fonctionf
qui prendP
comme argument un vecteur contenant les distances (par exemple[3, 4]
)APL fonctionne sur des vecteurs,
+/|P
applique donc l'|
opérateur (abs
fonction) à chaque élément du vecteur, puis évalue+
chaque élément (ajoute donc tous les éléments). Cela donne la distance de taxi.P*2
donne un vecteur qui est identique àP
mais avec chaque élément au carré.+/P*2
pour les ajouter ensemble (puis entre parenthèses car APL est de droite à gauche)*.5
pour obtenir la racine carrée. Cela donne la distance du corbeau.Ajoutez une paire de parenthèses supplémentaire pour la distance de taxi comme priorité et calculez la différence.
∇
pour terminer la fonction.la source
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 octets-1 merci à mon collègue Marshall.
Essayez-le en ligne!
Prend A comme argument de gauche et B comme argument de droite.
+
la somme&
de|
les magnitudes-
moins|
la magnitude@
dej.
A + B iAstuce de golf: combinez les valeurs en un nombre complexe car la diagonale est facile à obtenir, tout en les séparant, car la somme est facile à obtenir.
la source
Ajouter ++ ,
5957 octetsEssayez-le en ligne!
Cela m'a pris des années à résoudre. Cela n’arrondit pas avec la réponse finale car cela n’est pas possible dans Add ++. Voici comment le programme fonctionne avec les entrées
-3
et-4
(ACC
est la valeur de l'accumulateur)la source
PHP>=7.1, 54 bytes
PHP Sandbox Online
PHP, 55 bytes
Try it online!
PHP, 60 bytes
with an function instead of a full program
Try it online!
la source
Excel VBA, 34 Bytes
Anonymous VBE immediate window function that takes input from range
[A1:B1]
and outputs the difference between the Euclidean and Taxicab distances to the VBE immediate window.la source
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari/GP, 26 bytes
Try it online!
la source
Jelly, 7 bytes
Try it online!
Format is list of two numbers.
la source
,,,, 18 bytes
Essentially a port of my Python answer.
la source
Ruby, 31 bytes
Creates a complex number to calculate the distance with.
Try it online!
la source
Ruby (2.0.0 - 2.3.0), 57bytes
This assumes taking input from ARGV e.g.
This feels like a cheat since Ruby comes with a math lib that has abs and sqrt functions (unlike the guy who wrote his own abs and sqrt functions, though I didn't see anything specifically forbidding the use of such functions).
The first trick is using
.map
instead of.each
which saves a byte, then using the&:symbol
notation to pass map a proc we executeto_i
on each item in the array, and use multiple assignment to assign values to x and y.A longer version would be:
(since map returns an array, multiple assignment is probably the way to do it, this does throw away any additional parameters, but we're assuming only two inputs anyway)
Then I just removed all of the spaces in the equation.
Here's a longer version, 84 bytes
The goal here was to not repeat myself, e.g. having to write
x
orabs
twice and my squaring twicex**2 + y**2
It did not work.
But what's interesting is that puts doesn't need a space, I guess the lexer is smart enough to see the special char and know it's a special var.
inject
andreduce
are synonyms, inject has a signature ofIn our case we need to set the initial to 0, then we have our accumulator (i.e.: memo = 0) and the object from each iteration.
The down side to this method is that it will take more than two inputs and will either sum or square, add, then sqrt all the values in the array.
I think--though I don't have a Ruby 2.4.0 to test with--that this will work as well, which comes in at 72 bytes:
Sum defaults to 0 and as far as I can tell, works the same as inject/reduce.
la source
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
la source
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!
la source
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.la source