Calcule el taxi Numpad

8

El crédito va a donde se debe


Dados dos dígitos, x e y, calcule el número más corto de saltos horizontales o verticales para llegar de xay en un teclado numérico estándar, p. Ej.

789
456
123
00

Puede asumir con seguridad que todas las entradas serán 0-9, y no tiene que manejar entradas no válidas. La entrada puede ser el mismo número dos veces, que tiene una distancia de 0.

IO puede estar en cualquier formato razonable , y las lagunas estándar están prohibidas. ¡La respuesta más corta en bytes gana!

Muestra IO:

1, 4: 1
1, 8: 3
3, 7: 4
8, 2: 2
6, 1: 3
0, 9: 4
4, 4: 0
0, 4: 2
James
fuente

Respuestas:

3

Jalea , 11 bytes

o-1.’d3ạ/ḞS

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

o-1.’d3ạ/ḞS  Main link. Argument: [a, b] (list of integers)

 -1.         Yield -1.5.
o            Take the logical OR of a and b with -1.5.
             This maps 0 to -1.5, and all other integers to themselves.
    ’        Decrement the results.
     d3      Divmod; compute quotient and remainder of each result divided by 3.
       ạ/    Reduce by absolute difference across columns.
         Ḟ   Floor; round all differences down to the nearest integer.
          S  Sum; add the rounded absolute differences.
Dennis
fuente
Buen regreso.
Leaky Nun
3

Python, 140 114 bytes

Soy primerizo, así que por favor ayuda. Aquí está mi código.

def f(x,y):x,y,k=x-1,y-1,abs;return x!=-1 and y!=-1 and k(y//3-x//3)+k(y%3-x%3) or k(y//3-x//3)+int(max(x,y)%3==2)
TheRandomGuy
fuente
1
Algunos consejos: 1) use espacios individuales para las sangrías, 2) coloque los paréntesis alrededor de la condición if, 3) elimine el espacio en la lista de argumentos, 4) divmodpuede ayudarlo, 5) en lugar de if cond:return A\nelse:return Bhacerlo return cond and A or B.
Mego
@Mego ¿Cómo divmodayuda? No creo que haya guardado bytes con eso
Sp3000
@ Sp3000 Quizás Mego significa que al definir (por ejemplo) p,q=divmod(x,3);r,s=divmod(y,3), Dhruv podría guardar bytes k(y//3-x//3)+k(y%3-x%3al cambiar a k(r-p)+k(s-q). Además, creo que puede eliminar inty simplemente tener(max(x,y)%3==2)
Sherlock9
2
@ Sherlock9 La cosa es p,q=x//3,x%3que siempre es mejor que p,q=divmod(x,3), incluso en Python 3
Sp3000
1
@DrGreenEggsandHamDJ Las lambdas de Python no admiten la asignación múltiple. Perdería muchos bytes sin esas definiciones.
Sherlock9
2

JavaScript (ES6), 59

Lamentablemente, no divmoden javascript. De hecho, no es entero div, y modtampoco: el %no es exactamente mod. Pero por una vez, el comportamiento extraño de %con números negativos es útil.

(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

Prueba

f=(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

for(i=0;i<10;console.log(r),i++)
  for(r='',j=0;j<10;j++)
    r+=[i,j,f(i,j)]+' '

edc65
fuente
Entonces, esto termina calculando como si estuviera 0a la izquierda en 1lugar de debajo de él, y luego (a*b%3<0)es el ajuste furtivo para el segundo 0. ¡Agradable!
Neil
1

Pyth, 22 21 19 bytes

FGITW.

L.D?b+2b.5 3ssaMCyM

Banco de pruebas.

Tabla de conversión:

0: [0.0, 0.5]
1: [1, 0]
2: [1, 1]
3: [1, 2]
4: [2, 0]
5: [2, 1]
6: [2, 2]
7: [3, 0]
8: [3, 1]
9: [3, 2]
Monja permeable
fuente
1

Python 2, 61 bytes

lambda x,y:abs(x/-3-y/-3)+abs((x or 1.5)%-3-(y or 1.5)%-3)//1

Pruébalo en Ideone .

Cómo funciona

  • Distancia vertical

    La división entera siempre ronda hacia abajo al entero más cercano en Python, obteniéndose los siguientes resultados para los 10 dividendos posibles dividido por -3 .

     0  1  2  3  4  5  6  7  8  9
     0 -1 -1 -1 -2 -2 -2 -3 -3 -3

    Por lo tanto, podemos calcular la distancia vertical entre x e y como abs(x/-3-y/-3).

  • Distancia horizontal

    Para las columnas, podemos evitar tratar 0 como un caso especial reemplazándolo por 1.5 , colocándolo así "entre" la primera y la segunda columna.

    Modulus ( %) siempre tiene el signo del divisor en Python, produciendo los siguientes resultados para los 10 posibles dividendos módulo -3 .

       0  1  2  3  4  5  6  7  8  9
    -1.5 -2 -1  0 -2 -1  0 -2 -1  0

    Por lo tanto, al redondear ( //1) el resultado de abs((x or 1.5)%-3-(y or 1.5)%-3), podemos calcular la diferencia horizontal entre x e y .

Dennis
fuente
0

Java 149 160 caracteres

Lo obligatorio: porque ... ya sabes ... ¡Java! Divirtiéndose con Java en menos de 150 161 caracteres:

int d(int f,int t){if(f==t)return 0;if(Math.min(f,t)==0){int m=Math.max(f,t);return Math.min(d(1,m),d(2,m))+1;}return Math.abs(--t%3- --f%3)+Math.abs(t/3-f/3);}

Sin golfista en una clase:

public class Q80357 {

    static int distance(int from, int to) {
        if (from == to)
            return 0;
        if (Math.min(from, to) == 0) {
            int max = Math.max(from, to);
            return Math.min(distance(1, max), distance(2, max)) + 1;
        }
        return Math.abs(--to % 3 - --from % 3) + Math.abs(to / 3 - from / 3);
    }
}

Cómo funciona

Primero capta el caso estándar donde no tenemos que movernos a ningún lado.

Ahora podemos suponer que ambos enteros difieren, por lo que solo el más pequeño puede ser 0. Si este es el caso, calculamos la distancia desde la tecla 1 y 2 a la otra tecla. Usaremos el que tenga la distancia más corta y agregaremos un paso para pasar de 1 o 2 a 0.

Si no queremos ir a / desde cero, solo tenemos que movernos en la cuadrícula de 3x3. Podemos determinar la columna y la fila de la clave usando mod o div respectivamente. Luego calculamos la distancia entre columnas y filas y las sumamos. Esta es la distancia que necesitamos llegar de una tecla a otra.

Espero que la explicación se pueda entender, siéntase libre de jugar al golf :)

Actualizaciones

Tuve que cambiarlo a una función real, ya que usa la recursión que no es posible con lambdas:, (

Frozn
fuente