Introdução
O desafio de hoje é sobre dentes. Especificamente, quanto tempo leva para escovar de um dente para outro. Seu desafio é, dada a localização de dois dentes, produzir o menor tempo possível para escovar do primeiro ao segundo.
Desafio
Para esse desafio, usaremos o layout de uma boca humana adulta média:
Este diagrama mostra o sistema de numeração ISO amplamente utilizado . O sistema divide a boca em quatro partes e atribui-lhes um número: superior direito (1), superior esquerdo (2), inferior esquerdo (3) e inferior direito (4). Eles então numeram os dentes de cada seção do meio da boca de 1 a 8. Portanto, o quarto dente do centro no lado superior direito (seção 1) é o número 14.
Vamos supor que escovar um dente leva 1 unidade de tempo. Mover de um dente para o próximo de lado leva 0 unidades de tempo. Você também pode passar de um dente para o dente diretamente acima ou abaixo dele, o que também leva 1 unidade de tempo. Então, quanto tempo você leva para escovar do dente 14 ao dente 31? Observando o diagrama acima, você verá que são necessárias 7 unidades de tempo. Aqui está como isso é calculado:
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
Observe que ele não é o único caminho que poderíamos seguir, mas não há rotas mais curtas.
Portanto, seu desafio é:
- Você escreverá um programa ou função completo que aceita dois argumentos que são números de dentes e gera (ou retorna) o menor tempo possível para passar de um para o outro.
- Você faz a entrada como números ou seqüências de caracteres e a saída como desejar ( dentro de métodos aceitáveis ).
- As brechas padrão são proibidas por padrão.
- Esta questão é código-golfe , pelo que o menor número de vitórias vence.
Aqui estão alguns casos de teste ( Obrigado Jonathan Allan ):
14, 21 => 5 14, 44 => 3 14, 14 => 1 33, 37 => 5
Boa sorte!
Respostas:
Geléia ,
2420 bytesUm link monádico que aceita uma lista de dois números inteiros (por exemplo,
[14,31]
do exemplo de 14 a 31), que gera o tempo de escovação.Experimente online!
Anterior 24 byter construiu a boca e usou a base 8, a entrada era uma lista de listas de dígitos:
fonte
JavaScript (ES6), 65 bytes
Recebe entrada como strings.
fonte
Python 2 , 91 bytes
Experimente online!
fonte
JavaScript (ES6), 67 bytes
Espera entradas como duas matrizes de dois elementos com dígitos.
12
->[1, 2]
Espero que isso seja aceitável.Experimente online!
Parece quase duplicado para quase da resposta Python do @Chas Brown , para que eu possa removê-la, se necessário (não tenho certeza das convenções aqui).
Explicação
fonte
Python 2 ,
8078 bytesProvavelmente algumas oportunidades de golfe aqui ainda
Uma função sem nome que aceita dois números inteiros
s
ee
, que retorna o tempo de escovação.Experimente online!
fonte
Limpo ,
134128126 bytesExperimente online!
Define a função
$ :: Int Int -> Int
, que apenas encontra a distância entre os dois dentes como coordenadas cartesianas. Solução bastante chata realmente.fonte