El cepillo de dientes itinerante

10

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:

Diseño de boca humana.

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 , 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!

Anfibológico
fuente
1
@JonathanAllan agregará cuando vuelva a mi computadora.
Anfibológico
1
"Moverse de diente a diente lleva 0 unidades de tiempo". <- Más precisamente, creo que te refieres a "Moverse de un diente al siguiente de lado toma 0 unidades de tiempo". (La primera vez que lo llevé al movimiento medio a partir de cualquier diente a cualquier otra toma 1 unidad, lo que hizo la siguiente frase confusa.)
Sundar - Restablecer Mónica
@sundar tienes razón, editará.
Anfibológico
1
@JonathanAllan hecho.
Anfibológico

Respuestas:

3

Jalea ,  24  20 bytes

d30%20ị2¦⁵R;C$¤)ạ/Ḅ‘

Un 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:

8R;C$C+⁴U,+ɗ⁴
ḅ8¢œiⱮạ/Ḅ‘
Jonathan Allan
fuente
5

JavaScript (ES6), 65 bytes

f=([s,t],[u,v])=>s<3^u<3?f(s+t,5-u+v)+2:s-u?t-+-v:t<v?++v-t:++t-v

for(i=1;i<5;i++)for(j=1;j<9;j++){let o=document.createElement("option");o.text=""+i+j;s.add(o);t.add(o.cloneNode(true));}
<div onchange=o.textContent=f(s.value,t.value)><select id=s></select><select id=t></select><pre id=o>1

Toma la entrada como cadenas.

Neil
fuente
1

JavaScript (ES6), 67 bytes

([a,b],[x,y])=>(u=(a==x)+3*!(a+x-5))?Math.abs(b-y)+u:2*!(a-x&1)+b+y

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

var g =
([a,b], [x,y]) =>
    (u = (a == x)                // if same quadrant of mouth
     + 3 * !(a + x - 5))         // or strictly traversing vertically (e.g. 1 to 4, or 2 to 3)
        ? Math.abs(b - y) + u    // absolute difference plus additional units of time
        : 2 * !(a - x & 1)       // = 2 if traversing diagonally
            + b + y
redundancia
fuente
2
" Parece casi un duplicado de la respuesta Python de @Chas Brown, así que puedo eliminarla si es necesario (inseguro de las convenciones aquí) " . Dado que son idiomas diferentes, ambos pueden quedarse. Solo si dos respuestas en el mismo idioma son exactamente iguales, es una buena práctica que la última publicada elimine su respuesta (aunque si dos personas tienen exactamente la misma respuesta y la encuentran independiente una de otra, se les permite conservar ambas; la mayoría lo hará). sin embargo, elimine su respuesta si tienen exactamente lo mismo que alguien que publicó antes). Pero con diferentes idiomas no hay problema. Bienvenido a PPCG! :)
Kevin Cruijssen
1

Python 2 ,  80  78 bytes

Probablemente algunas oportunidades de golf aquí todavía

lambda s,e,l=(range(11)+range(0,-9,-1))*2:abs(l[s%30]-l[e%30]+s/30*2-e/30*2)+1

Una función sin nombre que acepta dos enteros, sy e, que devuelve el tiempo de cepillado.

Pruébalo en línea!

Jonathan Allan
fuente
0

Limpias , 134 128 126 bytes

import StdEnv
@n=hd[i\\i<-[0..]&k<-[18,17..11]++[21..28]++[48,47..41]++[31..38]|n==k]rem 16
$a b=abs(@a- @b)+a/30bitxor b/30+2

Prué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.

Οurous
fuente