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:
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! :)
10,10
debe ser 5.86, ya que aparece5.85786...
y redondeaste el que está debajo.Respuestas:
Taxi ,
73943773 bytesPrué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:
fuente
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 bytes
-1 byte gracias a @dtkaias
Fragmento de código de ejemplo:
fuente
**
.(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)
, para 36 bytes, también compatible con ES6?Julia, 20 bytes
Toma
a
yb
como una lista.El
norm
segundo argumento de Julia está predeterminado en 2, por lo tanto, esto sería equivalente anorm(x, 1) - norm(x, 2)
.fuente
Java 8, 47 bytes
Golfizado:
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
double
puede contener, que tiene una precisión de más de dos decimales y satisface el requisito de precisión de la pregunta.Sin golf:
Salida:
fuente
a->b->
.Mathematica, 32 bytes
o
Mathematica, 31 bytes
o @No es la sugerencia de un árbol
Mathematica, 26 bytes
o la sugerencia de @ alephalpha
Mathematica, 19 bytes
fuente
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
tal vez?Dyalog APL, 13 bytes
Pruébalo en línea!
Explicación (entrada X):
fuente
R , 30 bytes
Toma
v
como una matriz de 1 columna.norm
calcula una norma particular de una matriz, siendo el valor predeterminado la norma L1 (taxi) yf
la norma L2 ('f'
para Frobenius / Euclidean).Pruébalo en línea!
fuente
Python 2 ,
4038 bytes-2 bytes gracias a vaultah.
Dato curioso, 11 bytes de este código se copiaron de la pregunta y se jugaron golf.
Pruébalo en línea!
fuente
abs(a+b*1j)
debería funcionar en lugar de(a*a+b*b)**.5
Japt ,
119 bytes-2 bytes gracias a @ETHproductions
Pruébalo en línea!
Explicado
fuente
Mh
usado. Creo que puede acortarUa +Va
aNxa
(suma de entradas, ejecutándosea
en cada una)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,rw
se devuelve el mayor entero en una matriz).Esquema - 58 bytes.
fuente
define
y el(
, y otro entre el)
y el(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(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.Pyth, 8 bytes
Pruébalo en línea. Banco de pruebas.
Explicación
fuente
APL (Dyalog) , 14 bytes
Toma un argumento en la forma
xJy
, por ej.3J4
Pruébalo en línea!
|
la magnitud de Doc|
la magnitud del argumento-
menos2+/
la suma por pares∘
de|
las magnitudes de9 11.○⊢
El argumento es real y las partes imaginarias. DocEl 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○⊢)
fuente
J, 13 bytes
Esta es una función que toma las coordenadas como una matriz, por ejemplo:
Explicación:
fuente
&.:
- No estaba al tanto de lo:
de Under.05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
TI-Basic (TI-84 Plus CE), 10 bytes
Programe esa entrada como una lista de dos enteros en
Ans
, por ejemplo, llamada con{3,4}:prgmCROW
(reemplazando3,4
con la entrada yCROW
con el nombre del programa).Explicación:
fuente
√
y $ Ans ^ 2 $ están codificados. 10 pulsaciones de teclas , tal vez, pero eso no es lo mismo.MATL ,
87 bytesPruébalo en línea!
Explicación
fuente
Lisp común, 57 bytes
Pruébalo en línea!
fuente
GNU APL 1.2, 24 bytes
∇f P
declara una funciónf
que toma un vector queP
contiene las distancias como argumento (por ejemplo[3, 4]
)APL opera en vectores, por lo que
+/|P
aplica el|
operador (abs
funció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*2
produce un vector que es igualP
pero con cada elemento al cuadrado.+/P*2
para agregarlos juntos y luego (con paréntesis por precedencia porque APL es de derecha a izquierda)*.5
para 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.fuente
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 bytes-1 gracias a mi colega Marshall.
Pruébalo en línea!
Toma A como argumento izquierdo y B como argumento derecho.
+
la suma&
de|
las magnitudes-
menos|
la magnitud@
dej.
UNA + B iTruco 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.
fuente
Agregar ++ ,
5957 bytesPrué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
-3
y-4
(ACC
es el valor del acumulador)fuente
PHP> = 7.1, 54 bytes
PHP Sandbox en línea
PHP , 55 bytes
Pruébalo en línea!
PHP , 60 bytes
con una función en lugar de un programa completo
Pruébalo en línea!
fuente
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.fuente
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari / GP , 26 bytes
Pruébalo en línea!
fuente
Jalea , 7 bytes
Pruébalo en línea!
El formato es una lista de dos números.
fuente
,,, 18 bytes
Esencialmente un puerto de mi respuesta Python.
fuente
Ruby , 31 bytes
Crea un número complejo para calcular la distancia con.
Pruébalo en línea!
fuente
Rubí (2.0.0 - 2.3.0), 57bytes
Esto supone tomar la entrada de ARGV, por ejemplo
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
.map
lugar de.each
guardar un byte, luego usar la&:symbol
notació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:
(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
El objetivo aquí era no repetirme, por ejemplo, tener que escribir
x
oabs
dos 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.
inject
yreduce
son sinónimos, inyectar tiene una firma deEn 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:
La suma predeterminada es 0 y, por lo que puedo decir, funciona igual que inyectar / reducir.
fuente
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 TaxicabExcel, 32 bytes
Igual que el anterior pero formateado para MS Excel
fuente
Pyth , 7 bytes
Pruébalo aquí
Pyth ,
2523 bytesEsta 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 :)
Pruébalo en línea!
fuente
Pip , 15 bytes
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))
.a
yb
son los dos primeros argumentos de cmdline, yg
es la lista de argumentos de cmdline (es decir, argv). El*
operador vectoriza, como muchos operadores Pip, por lo que$+g*g
es lo mismo quea*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*g
no guarda ningún byte sobre la versión menos ofuscada anterior.fuente