La brosse à dents de voyage

10

introduction

Le défi d'aujourd'hui concerne les dents. Plus précisément, combien de temps il faut pour passer d'une dent à l'autre. Votre défi est, étant donné l'emplacement des deux dents, de produire le moins de temps possible pour brosser de la première à la seconde.

Défi

Pour ce défi, nous utiliserons une disposition d'une bouche humaine adulte moyenne:

Disposition de la bouche humaine.

Ce diagramme montre le système de numérotation ISO largement utilisé . Le système divise la bouche en quatre parties et leur attribue un numéro à chacune: en haut à droite (1), en haut à gauche (2), en bas à gauche (3) et en bas à droite (4). Ils numérotent ensuite les dents de chaque section du milieu de la bouche de 1 à 8. Par conséquent, la quatrième dent du centre dans le coin supérieur droit (section 1) est la dent numéro 14.

Supposons que le brossage d'une dent prenne 1 unité de temps. Passer d'une dent à l'autre prend latéralement 0 unité de temps. Vous pouvez également passer d'une dent à la dent directement au-dessus ou en dessous, ce qui prend également 1 unité de temps. Combien de temps vous faut-il pour passer de la dent 14 à la dent 31? En regardant le diagramme ci-dessus, vous verrez que cela prend 7 unités de temps. Voici comment cela est calculé:

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

Notez que ce n'est pas le seul itinéraire que nous aurions pu emprunter, mais il n'y a pas d'itinéraires plus courts.

Votre défi est donc:

  • Vous écrirez un programme ou une fonction complète qui accepte deux arguments qui sont des nombres de dents, et génère (ou renvoie) le temps le plus court pour passer de l'un à l'autre.
  • Vous effectuez la saisie sous forme de nombres ou de chaînes, et la sortie comme vous le souhaitez ( dans les méthodes acceptables ).
  • Les failles standard sont interdites par défaut.
  • Cette question est le , donc le bytecount le plus court gagne.
  • Voici quelques tests ( Merci Jonathan Allan ):

    14, 21 => 5
    14, 44 => 3
    14, 14 => 1
    33, 37 => 5
    

Bonne chance!

Amphibologique
la source
1
@JonathanAllan ajoutera lorsque je reviendrai à mon ordinateur.
Amphibologique
1
"Passer d'une dent à l'autre prend 0 unité de temps." <- Plus précisément, je pense que vous voulez dire "Passer d'une dent à l'autre sur le côté prend 0 unité de temps". (Je l'ai d'abord pris pour signifier passer d'une dent à une autre prend 1 unité, ce qui a rendu la phrase suivante déroutante.)
sundar - Rétablir Monica
@sundar vous avez raison, modifiera.
Amphibologique
1
@JonathanAllan fait.
Amphibologique

Réponses:

3

Gelée ,  24  20 octets

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

Un lien monadique acceptant une liste de deux entiers (par exemple [14,31]pour l' exemple de 14 à 31) qui donne le temps de brossage.

Essayez-le en ligne!


Les 24 octets précédents ont construit la bouche et utilisé la base 8, l'entrée était une liste de listes de chiffres:

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

JavaScript (ES6), 65 octets

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

Prend l'entrée sous forme de chaînes.

Neil
la source
1

JavaScript (ES6), 67 octets

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

Attend les entrées comme deux tableaux de chiffres à 2 éléments. 12->[1, 2] J'espère que c'est acceptable.

Essayez-le en ligne!

On dirait un double proche de la réponse Python de @Chas Brown , donc je peux le supprimer si nécessaire (incertain des conventions ici).

Explication

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
redondance
la source
2
" On dirait un double de la réponse Python de @Chas Brown, donc je peux la supprimer si nécessaire (pas sûr des conventions ici). " Comme ce sont des langues différentes, les deux peuvent rester. Ce n'est que si deux réponses dans la même langue sont exactement les mêmes qu'il est préférable que la dernière publiée supprime leur réponse (bien que si deux personnes ayant exactement la même réponse et qu'elles la trouvent indépendante l'une de l'autre, elles sont autorisées à conserver les deux; la plupart le feront supprimez leur réponse s'ils ont exactement la même chose que quelqu'un qui a posté plus tôt, cependant). Mais avec différentes langues, il n'y a pas de problème. Bienvenue chez PPCG! :)
Kevin Cruijssen
1

Python 2 ,  80  78 octets

Probablement encore quelques opportunités de golf ici

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

Une fonction sans nom acceptant deux entiers, set e, qui renvoie le temps de brossage.

Essayez-le en ligne!

Jonathan Allan
la source
0

Nettoyer , 134 128 126 octets

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

Essayez-le en ligne!

Définit la fonction $ :: Int Int -> Int, qui trouve simplement la distance entre les deux dents sous forme de coordonnées cartésiennes. Une solution assez ennuyeuse vraiment.

Οurous
la source