El cuervo contra el taxi

36

Imagínese viajar a un punto que se encuentra A millas de distancia horizontalmente y B millas de distancia verticalmente de su posición actual. O en otras palabras, viajar de (0, 0)un punto a otro (a, b). ¿Qué tan lejos necesitarías para terminar viajando? Esto parece una pregunta directa, pero la respuesta depende de a quién le pregunte. Si eres un cuervo, y se puede viajar en línea recta , la distancia recorrida es sólo la distancia euclídea al (a, b). Esto es

sqrt(a^2 + b^2)

Pero si solo eres un humano aburrido, realmente no quieres caminar tan lejos, así que tendrás que tomar un taxi. La mayoría de los taxis no conducirán en línea recta hacia su destino porque generalmente intentan permanecer en las carreteras. Entonces, la distancia real que terminarás viajando es la suma de la distancia vertical y la distancia horizontal. O la fórmula es:

abs(a) + abs(b)

Esto se llama la distancia del taxi . Esta imagen demuestra muy bien la diferencia entre los dos:

ingrese la descripción de la imagen aquí

Para viajar (6, 6), un cuervo puede volar en la línea verde, y esto le da una distancia de 6 * sqrt(2)aproximadamente 8.49. Un taxi puede tomar los caminos rojo, azul o amarillo, pero todos tomarán 12.

Esto lleva a la verdadera pregunta que estoy haciendo. Si un cuervo y un taxi salen de un punto (0, 0)y viajan a un punto (a, b), ¿cuánto más dura el camino del taxi? O, en más jerga matemática,

Dado un vector bidimensional, determine la diferencia entre el norm2 del vector y la norma1 del vector.

Debe escribir el programa o función más breve posible para responder a esta pregunta. Puede elegir tomar 'a' y 'b' como dos entradas separadas, o como una tupla de dos elementos. Puede tomar entrada y salida en cualquier formato razonable. Si la diferencia no es un entero, debe tener una precisión de al menos dos decimales.

Siempre puede suponer que 'a' y 'b' serán enteros, y que ambos no serán 0. (aunque es posible que cualquiera de ellos sea cero)

Como de costumbre, se aplican las lagunas estándar e intenta hacer que su programa sea lo más corto posible, contado en bytes.

Votaré cualquier respuesta que publique una explicación de cómo funciona el código y demuestre los trucos geniales utilizados para guardar bytes.

Aquí hay algunos ejemplos para que pruebe su código:

#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

Diviértete jugando al golf! :)

DJMcMayhem
fuente
99
¿podemos tomar la entrada como número complejo?
Uriel
Creo que el caso de prueba 10,10debe ser 5.86, ya que aparece 5.85786...y redondeaste el que está debajo.
numbermaniac
44
Leí por primera vez el título como The Cow vs The Taxicab y esperaba encontrar algo relacionado con la física de colisión ...
MooseBoys
¿Podemos dar resultados negativos?
Adám
@ Adám No. (Desde el punto de vista conceptual, estás devolviendo una distancia, que siempre es positiva)
DJMcMayhem

Respuestas:

107

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.

Pruébalo en línea!

Engineer Toast , un golfista de Taxi mucho más experimentado, decidió tomarse un tiempo (probablemente mucho menos que yo) y desarrollar mi programa de Taxi básicamente reescribiéndolo. Puede encontrar mi antiguo cuerpo de respuestas y enlaces a mis viejos TIO en el historial de edición.

Algoritmo de raíz cuadrada sin ingenio de Engineer Toast: ¡ Pruébelo en línea!

Sin golfos, con explicaciones:

[ 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
fuente
1
Esto es una locura ...
Gryphon - Restablecer a Mónica
2
@Gryphon lo loco es que estoy 100% seguro de que puedo eliminar como dos mil bytes una vez que reviso mi lógica mientras no estoy medio dormido
Stephen
44
¡4 horas merecen el +1 en sí mismo!
Shaggy
44
Estoy seguro de que el número de golfistas que leerán la explicación completa será menor que sus bytes: D
Grajdeanu Alex.
1
+1 para-1 is waiting at Starchild Numerology.
Keyu Gan
10

Javascript (ES6), 36 bytes

-1 byte gracias a @dtkaias

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

Fragmento de código de ejemplo:

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
fuente
ES6 no tiene **.
Neil
2
Una verdadera versión ES6 probablemente sería 41 bytes: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil
@DanEsparza Claramente solía hacerlo. Para eso es el historial de revisiones ...
Neil
¿Por qué no a=>b=>a+b-Math.hypot(a,b)?
dtkaias
1
Bien, ¿qué tal (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), para 36 bytes, también compatible con ES6?
dtkaias
8

Julia, 20 bytes

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

Toma ay bcomo una lista.

El normsegundo argumento de Julia está predeterminado en 2, por lo tanto, esto sería equivalente a norm(x, 1) - norm(x, 2).

Uriel
fuente
¡También pensé en usar a Julia!
enedil
Muy similar a la respuesta de MATLAB que estaba a punto de publicar.
TheIncredibleZ1
6

Java 8, 47 bytes

Golfizado:

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

Esto es lo más básico posible: reste los dos valores calculados para encontrar la diferencia. Esto utiliza lógica ternaria en lugar de Math.abs()guardar un byte cada vez que ocurre. Desafortunadamente, los paréntesis son obligatorios debido a la precedencia del operador.

El resultado es todo lo que Java doublepuede contener, que tiene una precisión de más de dos decimales y satisface el requisito de precisión de la pregunta.

Sin golf:

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

Salida:

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
fuente
1
Se puede utilizar para guardar currificación un byte: a->b->.
Jakob
4

Mathematica, 32 bytes

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

o

Mathematica, 31 bytes

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

o @No es la sugerencia de un árbol

Mathematica, 26 bytes

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

o la sugerencia de @ alephalpha

Mathematica, 19 bytes

N[#~Norm~1-Norm@#]&
J42161217
fuente
¡Buen trabajo! Puede guardar unos pocos bytes utilizando números complejos para la parte euclidiana:N[Tr@Abs@{##}-Abs[#+I#2]]&
No es un árbol
2
N[#~Norm~1-Norm@#]&.
alephalpha
2
@alephalpha #~Norm~1-N@Norm@#&tal vez?
Martin Ender
4

Dyalog APL, 13 bytes

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

Pruébalo en línea!

Explicación (entrada X):

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

R , 30 bytes

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

Toma vcomo una matriz de 1 columna. normcalcula una norma particular de una matriz, siendo el valor predeterminado la norma L1 (taxi) y fla norma L2 ( 'f'para Frobenius / Euclidean).

Pruébalo en línea!

Giuseppe
fuente
Wow, R tiene ambos integrados, ¡bien!
BLT
3

Python 2 , 40 38 bytes

-2 bytes gracias a vaultah.

Dato curioso, 11 bytes de este código se copiaron de la pregunta y se jugaron golf.

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

Pruébalo en línea!

totalmente humano
fuente
1
He sido ninja
Mr. Xcoder
@ Mr.Xcoder No estaría demasiado preocupado por eso, probablemente estaré fuera de juego. : P
totalmente humano
@vaultah Oh, buen punto. ¡Gracias!
totalmente humano
55
abs(a+b*1j)debería funcionar en lugar de(a*a+b*b)**.5
SteamyRoot
3

Japt , 11 9 bytes

-2 bytes gracias a @ETHproductions

Nxa -MhUV

Pruébalo en línea!

Explicado

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
fuente
Bien, creo que esta es la primera vez que lo veo Mhusado. Creo que puede acortar Ua +Vaa Nxa(suma de entradas, ejecutándose aen cada una)
ETHproductions
@ETHproductions Ah, claro, olvidé que la suma tenía el parámetro de mapa opcional. ¡Gracias!
Justin Mariner
Así que * es "un uso para Mh!: D La mayoría de los métodos en Japt pueden tomar lo que @ETHproductions llama una" función automática "como argumento. Vea este consejo para obtener más información sobre ellos. Y escribiré un consejo mañana en uso de auto-funciones con reducción de matriz para lograr algunos resultados interesantes (por ejemplo, rwse devuelve el mayor entero en una matriz).
Shaggy
@ Shaggy Gracias, tuve la idea básica de "funciones automáticas" pero no me di cuenta de que había una publicación para consejos de Japt. Definitivamente voy a mirar esa publicación.
Justin Mariner
Todavía tenemos mucho trabajo por hacer en esa pregunta, así que si tiene algo que cree que podría agregarse, hágalo. O si tiene una consulta que cree que encajaría allí, háganos saber en los comentarios o únase a nosotros en la sala de chat .
Shaggy
3

Esquema - 58 bytes.

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))
GenRincewind
fuente
3
Bienvenido a PPCG!
Martin Ender
Puede eliminar dos espacios: uno entre el definey el (, y otro entre el )y el (.
clismique
Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Aaron
(lambda(a b)(...))debería ser suficiente en lugar de vincularlo a un nombre. Además, (sqrt(* a a b b))ahorraría un par de bytes.
Daniel Schepler
3

APL (Dyalog) , 14 bytes

Toma un argumento en la forma xJy, por ej.3J4

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

Pruébalo en línea!

| la magnitud de Doc

| la magnitud del argumento

- menos

2+/ la suma por pares

 de

| las magnitudes de

9 11.○⊢ El argumento es real y las partes imaginarias. Doc

El truco especial para jugar al golf fue el uso de la reducción por pares ( 2+/) para proporcionar +/un argumento izquierdo sin operación, evitando así los paréntesis:||-(+/∘|9 11○⊢)

Adán
fuente
3

J, 13 bytes

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

Esta es una función que toma las coordenadas como una matriz, por ejemplo:

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

Explicación:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square
marinus
fuente
Buen uso de &.:- No estaba al tanto de lo :de Under.
Jonás
2

05AB1E , 7 bytes

ÄO¹nOt-

Pruébalo en línea!

Explicación

Ä        # absolute value of inputs
 O       # sum
  ¹      # push input again
   n     # square
    O    # sum
     t   # sqrt
      -  # subtract
Emigna
fuente
2

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

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

Programe esa entrada como una lista de dos enteros en Ans, por ejemplo, llamada con {3,4}:prgmCROW(reemplazando 3,4con la entrada yCROW con el nombre del programa).

Explicación:

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
pizzapants184
fuente
Eso me parece 24-26 bytes, dependiendo de cómo y $ Ans ^ 2 $ están codificados. 10 pulsaciones de teclas , tal vez, pero eso no es lo mismo.
Ray
@Ray TI-Basic es un lenguaje tokenizado .
pizzapants184
Estoy familiarizado con TI-89 Basic, donde ese no es el caso. Objeción retirada.
Ray
2

MATL , 8 7 bytes

|sG2&|-

Pruébalo en línea!

Explicación

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

GNU APL 1.2, 24 bytes

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

∇f Pdeclara una función fque toma un vector que Pcontiene las distancias como argumento (por ejemplo [3, 4])

APL opera en vectores, por lo que +/|Paplica el |operador ( absfunción) a cada elemento en el vector y luego evalúa+ en cada elemento (entonces agregue todos los elementos). Esto le da a la distancia del taxi.

P*2produce un vector que es igual Ppero con cada elemento al cuadrado. +/P*2para agregarlos juntos y luego (con paréntesis por precedencia porque APL es de derecha a izquierda) *.5para obtener la raíz cuadrada. Esto le da al cuervo distancia.

Agregue un par adicional de paréntesis para la distancia de rodaje por prioridad y calcule la diferencia.

para finalizar la función.

Arc676
fuente
1
¿No puedes usar una lambda anónima? {(+/|⍵)-(+/⍵*2)*.5}?
Adám
@ Adám No tengo mucha experiencia con APL y la versión más reciente del intérprete de GNU (1.7) no se compilará en Mac, por lo que puede haber algunas limitaciones. Intentaré más tarde para ver si funciona. Gracias por el consejo.
Arc676
Casi todas las características de GNU APL también están en Dyalog APL, que está disponible gratuitamente en Mac . También puedes probarlo en línea .
Adám
Además, siéntase libre de unirse a la sala de chat de APL para obtener más información sobre APL.
Adám
2

J , 9 8 bytes

-1 gracias a mi colega Marshall.

+&|-|@j.

Pruébalo en línea!

Toma A como argumento izquierdo y B como argumento derecho.

+ la suma

& de

| las magnitudes

- menos

| la magnitud

@ de

j.UNA + B i

Truco de golf: combine los valores en un solo número complejo porque la diagonal es fácil de obtener así, mientras los mantiene separados porque la suma es fácil de obtener de esa manera.

Adán
fuente
2

Agregar ++ , 59 57 bytes

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

Pruébalo en línea!

Esto me llevó años resolverlo. No redondea la respuesta final ya que eso no es posible en Add ++. Así es como funciona el programa con las entradas -3y -4( ACCes el valor del acumulador)

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
caird coinheringaahing
fuente
1

PHP> = 7.1, 54 bytes

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

PHP Sandbox en línea

PHP , 55 bytes

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

Pruébalo en línea!

PHP , 60 bytes

con una función en lugar de un programa completo

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

Pruébalo en línea!

Jörg Hülsermann
fuente
1

Excel VBA, 34 bytes

Función de ventana inmediata anónima de VBE que toma la entrada del rango [A1:B1]y genera la diferencia entre las distancias Euclidiana y de taxi a la ventana inmediata de VBE.

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]
Taylor Scott
fuente
1
Es dos bytes más corto para ponerlo directamente en una celda en la hoja:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Engineer Toast
@EngineerToast, pensé que ya había publicado mis Hojas de cálculo de Google / Soluciones Excel - gracias por señalar esto
Taylor Scott
1

,,, 18 bytes

Esencialmente un puerto de mi respuesta Python.

a:↔a:0•2*⇆2*+√↔+↔-
totalmente humano
fuente
1

Ruby , 31 bytes

Crea un número complejo para calcular la distancia con.

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

Pruébalo en línea!

Tinta de valor
fuente
1

Rubí (2.0.0 - 2.3.0), 57bytes

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

Esto supone tomar la entrada de ARGV, por ejemplo

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

Esto se siente como una trampa ya que Ruby viene con una biblioteca matemática que tiene funciones abs y sqrt (a diferencia del tipo que escribió sus propias funciones abs y sqrt, aunque no vi nada que prohibiera específicamente el uso de tales funciones).

El primer truco es usar en .maplugar de .eachguardar un byte, luego usar la &:symbolnotación para pasar el mapa a un proceso que ejecutamosto_i en cada elemento de la matriz y usar asignaciones múltiples para asignar valores a x e y.

Una versión más larga sería:

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

(dado que map devuelve una matriz, la asignación múltiple es probablemente la forma de hacerlo, esto descarta cualquier parámetro adicional, pero de todos modos asumimos solo dos entradas)

Luego simplemente eliminé todos los espacios en la ecuación.

Aquí hay una versión más larga, 84 bytes

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

El objetivo aquí era no repetirme, por ejemplo, tener que escribir xo absdos veces y mi cuadratura dos vecesx**2 + y**2

No funcionó.

Pero lo interesante es que put no necesita un espacio, supongo que el lexer es lo suficientemente inteligente como para ver el carácter especial y saber que es una var especial.

injecty reduceson sinónimos, inyectar tiene una firma de

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

En nuestro caso, necesitamos establecer la inicial en 0, luego tenemos nuestro acumulador (es decir: memo = 0) y el objeto de cada iteración.

La desventaja de este método es que tomará más de dos entradas y sumará o cuadrará, sumará y luego cuadrará todos los valores de la matriz.

Yo creo --aunque no tengo un restaurante Ruby 2.4.0 a prueba con - que esto va a funcionar tan bien, que está en el puesto 72 bytes:

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

La suma predeterminada es 0 y, por lo que puedo decir, funciona igual que inyectar / reducir.

qubitrenegade
fuente
La única razón por la que no usó los builtins fue porque ese lenguaje no tenía ninguno disponible para que él usara. Buena respuesta, y bienvenido a PPCG! :)
Conor O'Brien
Bienvenido a PPCG! El TIO Portal tiene un Ruby 2.4.0 en funcionamiento que puede usar para probar cosas en línea. Pruébelo aquí
Value Ink el
Aprovechando los requisitos flexibles de E / S, puede evitar el análisis y la colocación, jugando al golf en una lambda de 35 bytes .
benj2240
1

Hojas de cálculo de Google, 31 bytes

Función de hoja de trabajo que toma datos del rango [A1:B1]y genera la diferencia entre las distancias Euclidiana y Taxicab

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

Excel, 32 bytes

Igual que el anterior pero formateado para MS Excel

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Taylor Scott
fuente
1

Pyth , 7 bytes

a.aQsa0

Pruébalo aquí


Pyth ,  25  23 bytes

Esta es la solución inicial, mi primera solución Pyth no tan trivial y puedes ver lo mal que solía ser en el golf en Pyth :)

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

Pruébalo en línea!

Sr. Xcoder
fuente
0

Pip , 15 bytes

ABa+ABb-RT$+g*g

Toma información de los argumentos de la línea de comandos. Pruébalo en línea!

Explicación

En pseudocódigo, esto es abs(a) + abs(b) - sqrt(fold+(g*g)).ay bson los dos primeros argumentos de cmdline, y ges la lista de argumentos de cmdline (es decir, argv). El *operador vectoriza, como muchos operadores Pip, por lo que $+g*ges lo mismo que a*a + b*b. El resto es bastante sencillo.

Desafortunadamente, no puedo guardar ningún byte $+ABg, porque la precedencia de los operadores con fold no funciona como debería. $+debería tener una precedencia ligeramente mayor que la binaria -, pero en este momento se analiza como$+(ABg-RT$+g*g) , dando la respuesta incorrecta. Hacer ($+ABg)-RT$+g*gno guarda ningún byte sobre la versión menos ofuscada anterior.

DLosc
fuente