La distancia de Manhattan en una cuadrícula regular es la cantidad de pasos ortogonales que uno debe tomar para llegar a una celda desde otra. Los pasos ortogonales son aquellos que pasan por los bordes de las celdas de la cuadrícula (a diferencia de las esquinas, lo que nos daría la distancia de Chebyshev ).
Podemos definir una distancia similar en otras cuadrículas, por ejemplo, la cuadrícula triangular. Podemos abordar las celdas individuales en la cuadrícula con el siguiente esquema de indexación, donde cada celda contiene un x,y
par:
____________________________________...
/\ /\ /\ /\ /\
/ \ 1,0/ \ 3,0/ \ 5,0/ \ 7,0/ \
/ 0,0\ / 2,0\ / 4,0\ / 6,0\ / 8,0\
/______\/______\/______\/______\/______\...
\ /\ /\ /\ /\ /
\ 0,1/ \ 2,1/ \ 4,1/ \ 6,1/ \ 8,1/
\ / 1,1\ / 3,1\ / 5,1\ / 7,1\ /
\/______\/______\/______\/______\/___...
/\ /\ /\ /\ /\
/ \ 1,2/ \ 3,2/ \ 5,2/ \ 7,2/ \
/ 0,2\ / 2,2\ / 4,2\ / 6,2\ / 8,2\
/______\/______\/______\/______\/______\...
\ /\ /\ /\ /\ /
\ 0,3/ \ 2,3/ \ 4,3/ \ 6,3/ \ 8,3/
\ / 1,3\ / 3,3\ / 5,3\ / 7,3\ /
\/______\/______\/______\/______\/___...
/\ /\ /\ /\ /\
. . . . . . . . . .
. . . . . . . . . .
Ahora, la distancia de Manhattan en esta cuadrícula es nuevamente el número mínimo de pasos a través de los bordes para llegar de una celda a otra. Por lo que puede pasar de 3,1
a 2,1
, 4,1
o 3,2
, pero no a cualquier otro triángulo, ya que los cruzaría puntos en lugar de los bordes.
Por ejemplo, la distancia de 2,1
a 5,2
es 4
. El camino más corto generalmente no es único, pero una forma de hacer la distancia en 4 pasos es:
2,1 --> 3,1 --> 3,2 --> 4,2 --> 5,2
El reto
Dados dos pares de coordenadas y del esquema de direccionamiento anterior, devuelva la distancia de Manhattan entre ellos.x1,y1
x2,y2
Puede suponer que las cuatro entradas son enteros no negativos, cada uno menor que 128. Puede tomarlos en cualquier orden y agruparlos arbitrariamente (cuatro argumentos separados, una lista de cuatro enteros, dos pares de enteros, una matriz de 2x2, .. .).
Puede escribir un programa o una función y utilizar cualquiera de los métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas por defecto.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
Cada caso de prueba se da como .x1,y1 x2,y2 => result
1,2 1,2 => 0
0,1 1,1 => 1
1,0 1,1 => 3
2,1 5,2 => 4
0,0 0,127 => 253
0,0 127,0 => 127
0,0 127,127 => 254
0,127 127,0 => 254
0,127 127,127 => 127
127,0 127,127 => 255
75,7 69,2 => 11
47,58 36,79 => 42
77,9 111,23 => 48
123,100 111,60 => 80
120,23 55,41 => 83
28,20 91,68 => 111
85,107 69,46 => 123
16,25 100,100 => 159
62,85 22,5 => 160
92,26 59,113 => 174
62,22 35,125 => 206
fuente
(a,b,x,y)->c(a,b,x,y,0)
(llamando al método separadoc
con los cuatro argumentos y0
como quinto argumento) a mi respuesta.Respuestas:
JavaScript (ES6),
8478 bytesGuardado 6 bytes gracias a Neil
Casos de prueba
Mostrar fragmento de código
Solución recursiva inicial,
1008881Guardado 12 bytes gracias a ETHproductions
Guardado 7 bytes gracias a Neil
Cómo funciona
Aunque todavía se aplica esencialmente a la versión actual, la siguiente explicación se refiere más específicamente a la versión inicial:
Pasar de (x0, y) a (x1, y) es trivial porque podemos atravesar los bordes laterales desde el triángulo de origen hasta el objetivo. La distancia de Manhattan en este caso es | x0 - x1 | .
La parte difícil son los pasos verticales. Para pasar de la fila y0 a la fila y1 , tenemos que tener en cuenta estos dos parámetros:
La orientación de un triángulo viene dada por la paridad de x + y :
Podemos ir hacia abajo desde un triángulo apuntando hacia arriba (útil cuando y0 <y1 ) y hacia arriba desde un triángulo apuntando hacia abajo (útil cuando y0> y1 ).
Al combinar la orientación del triángulo con la comparación entre y0 e y1 , obtenemos la fórmula x + y0 + (y0> y1? 1: 0) cuyo resultado es incluso si podemos ir en la dirección deseada e impar si no.
Si no podemos llegar directamente a la siguiente fila, primero debemos obtener una alineación correcta actualizando x :
Casos de prueba
Mostrar fragmento de código
fuente
n
variable por completo y simplemente agregar 1 al resultado de cada iteración? ( 90 caracteres , creo)&
significa que puede hacera+b+(b>d)&1
para guardar 2 bytesf=(a,b,c,d,e=b==d|a+b+(b>d)&1)=>a-c|b-d&&f(e?a+1-2*(a>c):a,e?b:b+1-2*(b>d),c,d)+1
Python 2, 74 bytes
fuente
**(x^y^(Y>=y))
?Lote, 99 bytes
Explicación: Un movimiento de solo horizontes simplemente toma la diferencia absoluta de coordenadas x. Para x lo suficientemente grande, el movimiento vertical solo toma un paso adicional por diferencia absoluta de coordenadas y, pero para x pequeño, toma cuatro pasos adicionales por dos diferencias de coordenadas y, más uno o tres pasos para una diferencia impar. Esto se calcula como dos pasos por diferencia más un factor de corrección. El resultado es el mayor de los dos pasos corregidos y la suma de las diferencias absolutas, aunque esto se calcula como el mayor de la diferencia de coordenadas y absoluta absoluta corregida y la distancia absoluta de coordenadas x añadida a la diferencia de coordenadas y absoluta absoluta sin corregir .
@cmd/cset/a"
- Evalúa expresiones separadas por comas e imprime la última.x=%3-%1,x*=x>>31|1
y=%4-%2,w=y>>31,y*=w|1
z=x+(y+x&1)*(-(%1+%2+w&1)|1)-y
z*=z>>31,x+y+z
fuente
Jalea , 24 bytes
Pruébalo en línea!
fuente
raqueta / esquema, 214 bytes
fuente
05AB1E , 24 bytes
Pruébalo en línea!
Descompostura
fuente
©
aD
y retire el®
? Parece funcionar para el caso actualmente en su TIO, pero no estoy seguro si sigue el mismo camino para cada caso.M
el comportamiento se vería afectado por esto. Falla por[[0, 127], [0, 0]]
.Python 2 ,
747271 bytesPruébalo en línea! El enlace incluye casos de prueba. Editar: Guardado 2 bytes gracias a @JoKing. Salvó un byte adicional gracias a @ Mr.Xcoder. Basado en la siguiente fórmula que encontré en esta pregunta :
fuente
lambda c,a,d,b:abs(a-b)+abs(a+-(c+a)/2-b--(d+b)/2)+abs((c+a)/2-(d+b)/2)
debería guardar 3 bytes.Pyth ,
3128 bytesPruébalo aquí! o prueba la suite de prueba!
Descompostura
fuente
05AB1E , 16 bytes
Utiliza una versión modificada de la respuesta de Neil , optimizada para lenguajes basados en pila como 05AB1E. Toma la entrada como dos pares de coordenadas,( x1, x2) , ( y1, y2) , separados por una nueva línea de STDIN. Inicialmente fusioné eso con mi otra respuesta 05AB1E, pero luego decidí publicarlo por separado porque es muy, muy diferente.
Pruébalo en línea! o prueba la suite de prueba! (Utiliza una versión ligeramente modificada del código (en
®
lugar de²
), cortesía de Kevin Cruijssen )fuente
©+®
aDŠ+
él es más fácil configurar un conjunto de pruebas. ;) Aquí está ese conjunto de pruebas, y todos los casos de prueba están teniendo éxito (ignore el encabezado desordenado; p).Jalea ,
22 .. 1615 bytesPruébalo en línea!
Pruebe todos los casos de prueba.
Utiliza el método de @ Neil en esta respuesta que utiliza una fórmula modificada de esta pregunta matemática.
Toma las coordenadas como argumentos
y1, y2
yx1, x2
.fuente
Java 8,
157190188144142141127 bytes+33 bytes (157 → 190) debido a una corrección de errores.
-44 bytes (188 → 144) que convierten el método recursivo en un único método de bucle.
-14 bytes gracias a @ceilingcat .
Explicación:
Pruébalo aquí
fuente
z*z<c*c
lugar de(z<0?-z:z)<(c<0?-c:c)