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

Respuestas:
Jalea , 11 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Python,
140114 bytesSoy primerizo, así que por favor ayuda. Aquí está mi código.
fuente
divmodpuede ayudarlo, 5) en lugar deif cond:return A\nelse:return Bhacerloreturn cond and A or B.divmodayuda? No creo que haya guardado bytes con esop,q=divmod(x,3);r,s=divmod(y,3), Dhruv podría guardar bytesk(y//3-x//3)+k(y%3-x%3al cambiar ak(r-p)+k(s-q). Además, creo que puede eliminarinty simplemente tener(max(x,y)%3==2)p,q=x//3,x%3que siempre es mejor quep,q=divmod(x,3), incluso en Python 3Jalea, 13 bytes
Pruébalo en línea!
Puerto de mi respuesta Pyth .
Banco de pruebas.
fuente
JavaScript (ES6), 59
Lamentablemente, no
divmoden javascript. De hecho, no es enterodiv, ymodtampoco: el%no es exactamentemod. Pero por una vez, el comportamiento extraño de%con números negativos es útil.Prueba
fuente
0a la izquierda en1lugar de debajo de él, y luego(a*b%3<0)es el ajuste furtivo para el segundo0. ¡Agradable!Pyth,
222119 bytesFGITW.
Banco de pruebas.
Tabla de conversión:
fuente
Julia, 56 bytes
Pruébalo en línea!
fuente
Python 2, 61 bytes
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 .
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 .Por lo tanto, al redondear (
//1) el resultado deabs((x or 1.5)%-3-(y or 1.5)%-3), podemos calcular la diferencia horizontal entre x e y .fuente
Java
149160 caracteresLo obligatorio: porque ... ya sabes ... ¡Java! Divirtiéndose con Java en menos de
150161 caracteres:Sin golfista en una clase:
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:, (
fuente