Introducción
El desafío de hoy se trata de dientes. Específicamente, cuánto tiempo lleva cepillarse de un diente a otro. Su desafío es, dada la ubicación de dos dientes, producir el menor tiempo posible para cepillarse del primero al segundo.
Desafío
Para este desafío, utilizaremos un diseño de una boca humana adulta promedio:
Este diagrama muestra el sistema de numeración ISO ampliamente utilizado . El sistema divide la boca en cuatro partes y les asigna a cada una un número: superior derecha (1), superior izquierda (2), inferior izquierda (3) y inferior derecha (4). Luego numeran los dientes de cada sección desde la mitad de la boca desde 1 a 8. Por lo tanto, el cuarto diente desde el centro en el lado superior derecho (sección 1) es el diente número 14.
Supongamos que cepillarse un diente lleva 1 unidad de tiempo. Moverse de un diente al siguiente de lado toma 0 unidades de tiempo. También puede cruzar de un diente al diente directamente encima o debajo de él, lo que también lleva 1 unidad de tiempo. Entonces, ¿cuánto tiempo te lleva cepillarte del diente 14 al diente 31? Al mirar el diagrama de arriba, verá que toma 7 unidades de tiempo. Así es como se calcula:
Action : Unit of time
Brushing tooth 14 : 1 unit
Brushing tooth 13 : 1 unit
Brushing tooth 12 : 1 unit
Brushing tooth 11 : 1 unit
Brushing tooth 21 : 1 unit
Cross to bottom of mouth : 1 unit
Brushing tooth 31 : 1 unit
------------------------------
Total: 7 units
Tenga en cuenta que esta no es la única ruta que podríamos haber tomado, pero no hay rutas más cortas.
Entonces tu desafío es:
- Escribirás un programa o función completa que acepte dos argumentos que sean números de dientes y genere (o devuelva) el tiempo más corto para pasar de uno a otro.
- Usted toma la entrada como números o cadenas, y la salida siempre que lo desee ( dentro de los métodos aceptables ).
- Las lagunas estándar están prohibidas por defecto.
- Esta pregunta es code-golf , por lo que gana el bytecount más corto.
Aquí hay algunos casos de prueba ( Gracias Jonathan Allan ):
14, 21 => 5 14, 44 => 3 14, 14 => 1 33, 37 => 5
¡Buena suerte!
Respuestas:
Jalea ,
2420 bytesUn enlace monádico que acepta una lista de dos enteros (por ejemplo,
[14,31]
para el ejemplo del 14 al 31) que produce el tiempo de cepillado.Pruébalo en línea!
El anterior 24 byter construyó la boca y usó la base 8, la entrada fue una lista de listas de dígitos:
fuente
JavaScript (ES6), 65 bytes
Toma la entrada como cadenas.
fuente
Python 2 , 91 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 67 bytes
Espera entradas como dos conjuntos de dígitos de 2 elementos.
12
->[1, 2]
Espero que esto sea aceptable.Pruébalo en línea!
Parece casi un duplicado de la respuesta de Python de @Chas Brown , por lo que puedo eliminarlo si es necesario (no estoy seguro de las convenciones aquí).
Explicación
fuente
Python 2 ,
8078 bytesProbablemente algunas oportunidades de golf aquí todavía
Una función sin nombre que acepta dos enteros,
s
ye
, que devuelve el tiempo de cepillado.Pruébalo en línea!
fuente
Limpias ,
134128126 bytesPruébalo en línea!
Define la función
$ :: Int Int -> Int
, que solo encuentra la distancia entre los dos dientes como coordenadas cartesianas. Solución bastante aburrida realmente.fuente