Die reisende Zahnbürste

10

Einführung

Bei der heutigen Herausforderung dreht sich alles um Zähne. Insbesondere, wie lange es dauert, von einem Zahn zum anderen zu putzen. Ihre Herausforderung besteht darin, angesichts der Position von zwei Zähnen die kürzestmögliche Zeit zum Putzen vom ersten zum zweiten auszugeben.

Herausforderung

Für diese Herausforderung verwenden wir ein Layout eines durchschnittlichen erwachsenen menschlichen Mundes:

Layout des menschlichen Mundes.

Dieses Diagramm zeigt das weit verbreitete ISO-Nummerierungssystem . Das System teilt den Mund in vier Teile und weist ihnen jeweils eine Nummer zu: oben rechts (1), oben links (2), unten links (3) und unten rechts (4). Sie nummerieren dann die Zähne jedes Abschnitts von der Mitte des Mundes von 1 bis 8. Daher ist der vierte Zahn von der Mitte oben rechts (Abschnitt 1) ​​die Zahnnummer 14.

Nehmen wir an, das Zähneputzen dauert 1 Einheit. Das seitliche Bewegen von einem Zahn zum nächsten dauert 0 Zeiteinheiten. Sie können auch von einem Zahn zum Zahn direkt darüber oder darunter wechseln, was ebenfalls 1 Zeiteinheit dauert. Wie lange brauchen Sie, um von Zahn 14 bis Zahn 31 zu putzen? Wenn Sie sich das obige Diagramm ansehen, werden Sie sehen, dass es 7 Zeiteinheiten dauert. So wird das berechnet:

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

Beachten Sie, dass dies nicht die einzige Route ist, die wir hätten nehmen können, aber es gibt keine kürzeren Routen.

Ihre Herausforderung lautet also:

  • Sie schreiben ein vollständiges Programm oder eine vollständige Funktion, die zwei Argumente akzeptiert, bei denen es sich um Zahnzahlen handelt, und die kürzeste Zeit zum Putzen von einem zum anderen ausgibt (oder zurückgibt).
  • Sie nehmen Eingaben als Zahlen oder Zeichenfolgen vor und geben sie nach Belieben aus ( innerhalb akzeptabler Methoden ).
  • Standardlücken sind standardmäßig verboten.
  • Diese Frage ist , also gewinnt der kürzeste Bytecount.
  • Hier sind einige Testfälle ( Danke Jonathan Allan ):

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

Viel Glück!

Amphibologisch
quelle
1
@ JonathanAllan wird hinzugefügt, wenn ich wieder auf meinem Computer bin.
Amphibological
1
"Der Übergang von Zahn zu Zahn dauert 0 Zeiteinheiten." <- Genauer gesagt, ich denke du meinst "Das Bewegen von einem Zahn zum nächsten seitwärts dauert 0 Zeiteinheiten". (Ich habe es zuerst so verstanden, dass der Wechsel von einem Zahn zu einem anderen 1 Einheit dauert, was den nächsten Satz verwirrend machte.)
Sundar - Monica
@ Sundar du hast recht, wird bearbeiten.
Amphibological
1
@ JonathanAllan fertig.
Amphibological

Antworten:

3

Gelee ,  24  20 Bytes

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

Eine monadische Verknüpfung, die eine Liste von zwei ganzen Zahlen akzeptiert (z. B. [14,31]für das Beispiel von 14 bis 31), die die Bürstzeit ergibt.

Probieren Sie es online aus!


Vorherige 24 Byter bauten den Mund und verwendeten Basis 8, Eingabe war eine Liste von Listen von Ziffern:

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

JavaScript (ES6), 65 Byte

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

Nimmt Eingaben als Zeichenfolgen auf.

Neil
quelle
1

JavaScript (ES6), 67 Byte

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

Erwartet Eingaben als zwei 2-Element-Arrays von Ziffern. 12-> [1, 2]Ich hoffe das ist akzeptabel.

Probieren Sie es online aus!

Sieht fast wie ein Duplikat der Python-Antwort von @Chas Brown aus , sodass ich sie bei Bedarf entfernen kann (Unsicherheit der Konventionen hier).

Erläuterung

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
Redundanz
quelle
2
" Sieht aus wie ein Duplikat der Python-Antwort von @Chas Brown, daher kann ich sie bei Bedarf entfernen (unsicher, welche Konventionen hier gelten). " Da es sich um verschiedene Sprachen handelt, bleiben beide möglicherweise erhalten. Nur wenn zwei Antworten in derselben Sprache genau gleich sind, wird empfohlen, dass die zuletzt veröffentlichte Antwort ihre Antwort löscht (obwohl zwei Personen, die genau dieselbe Antwort haben und diese unabhängig voneinander fanden, beide behalten dürfen; die meisten werden dies tun Löschen Sie ihre Antwort, wenn sie genau die gleiche Antwort haben wie jemand, der früher gepostet hat. Aber mit verschiedenen Sprachen gibt es kein Problem. Willkommen bei PPCG! :)
Kevin Cruijssen
1

Python 2 ,  80  78 Bytes

Wahrscheinlich noch einige Golfmöglichkeiten hier

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

Eine unbenannte Funktion, die zwei Ganzzahlen akzeptiert, sund e, die die Putzzeit zurückgibt.

Probieren Sie es online aus!

Jonathan Allan
quelle
0

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

Probieren Sie es online aus!

Definiert die Funktion $ :: Int Int -> Int, die nur den Abstand zwischen den beiden Zähnen als kartesische Koordinaten ermittelt. Wirklich ziemlich langweilige Lösung.

Οurous
quelle