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
divmod
puede ayudarlo, 5) en lugar deif cond:return A\nelse:return B
hacerloreturn cond and A or B
.divmod
ayuda? 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%3
al cambiar ak(r-p)+k(s-q)
. Además, creo que puede eliminarint
y simplemente tener(max(x,y)%3==2)
p,q=x//3,x%3
que 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
divmod
en javascript. De hecho, no es enterodiv
, ymod
tampoco: el%
no es exactamentemod
. Pero por una vez, el comportamiento extraño de%
con números negativos es útil.Prueba
fuente
0
a la izquierda en1
lugar 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