Podróżna szczoteczka do zębów

10

Wprowadzenie

Dzisiejsze wyzwanie dotyczy zębów. W szczególności ile czasu zajmuje szczotkowanie od jednego zęba do drugiego. Twoim wyzwaniem jest, biorąc pod uwagę położenie dwóch zębów, uzyskanie jak najkrótszego czasu na szczotkowanie od pierwszego do drugiego.

Wyzwanie

Do tego wyzwania użyjemy układu przeciętnego dorosłego człowieka:

Układ ludzkich ust.

Ten schemat pokazuje szeroko stosowany system numeracji ISO . System dzieli usta na cztery części i przypisuje im każdą liczbę: prawy górny (1), lewy górny (2), lewy dolny (3) i prawy dolny (4). Następnie numerują zęby każdej sekcji od środka jamy ustnej od 1-8. Dlatego czwartym zębem od środka w prawym górnym rogu (część 1) jest ząb numer 14.

Załóżmy, że szczotkowanie jednego zęba zajmuje 1 jednostkę czasu. Przejście z jednego zęba do następnego na boki zajmuje 0 jednostek czasu. Możesz również przejść od zęba do zęba bezpośrednio nad nim lub pod nim, co również zajmuje 1 jednostkę czasu. Ile czasu zajmuje szczotkowanie zębów od zęba 14 do zęba 31? Patrząc na powyższy schemat, zobaczysz, że zajmuje to 7 jednostek czasu. Oto jak to się oblicza:

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

Zwróć uwagę, że nie jest to jedyna trasa, którą mogliśmy obrać, ale nie ma krótszych tras.

Twoim wyzwaniem jest:

  • Napiszemy pełny program lub funkcję, która akceptuje dwa argumenty, które są liczbami zębów, i wyświetla (lub zwraca) najkrótszy czas na zamiatanie od jednego do drugiego.
  • Podejmujesz dane wejściowe jako liczby lub ciągi i wypisujesz je w dowolny sposób ( w ramach akceptowalnych metod ).
  • Standardowe luki są domyślnie zabronione.
  • To pytanie dotyczy , więc wygrywa najkrótsza liczba bajtów.
  • Oto kilka przypadków testowych ( Dzięki Jonathan Allan ):

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

Powodzenia!

Amfibologiczne
źródło
1
@JonathanAllan doda, gdy wrócę do mojego komputera.
Amfibologiczny
1
„Przejście od zęba do zęba zajmuje 0 jednostek czasu.” <- Mówiąc ściślej, myślę, że masz na myśli "Przejście od jednego zęba do następnego na boki zajmuje 0 jednostek czasu". (Po raz pierwszy pomyślałem, że przejście z jednego zęba do innego zajmuje 1 jednostkę, co sprawiło, że następne zdanie było mylące.)
Sundar - Przywróć Monikę
@sundar masz rację, edytujesz.
Amfibologiczny
1
@JonathanAllan gotowe.
Amfibologiczny

Odpowiedzi:

3

Galaretka ,  24  20 bajtów

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

Łącze monadyczne akceptujące listę dwóch liczb całkowitych (np. [14,31]Dla przykładu od 14 do 31), co daje czas szczotkowania.

Wypróbuj online!


Poprzednie 24 byter zbudowało usta i użyło podstawy 8, wprowadzono listę list cyfr:

8R;C$C+⁴U,+ɗ⁴
ḅ8¢œiⱮạ/Ḅ‘
Jonathan Allan
źródło
5

JavaScript (ES6), 65 bajtów

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

Pobiera dane wejściowe jako ciągi znaków.

Neil
źródło
1

JavaScript (ES6), 67 bajtów

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

Oczekuje danych wejściowych jako dwóch 2-elementowych tablic cyfr. 12-> [1, 2]Mam nadzieję, że jest to do przyjęcia.

Wypróbuj online!

Wygląda jak niemal duplikat odpowiedzi Pythona @Chasa Browna , więc w razie potrzeby mogę ją usunąć (nie jestem pewien konwencji tutaj).

Wyjaśnienie

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
nadmiar
źródło
2
Wygląda jak niemal duplikat odpowiedzi Pythona @Chasa Browna, więc w razie potrzeby mogę ją usunąć (nie jestem pewien konwencji tutaj). ” Ponieważ są to różne języki, oba mogą zostać. Tylko jeśli dwie odpowiedzi w tym samym języku są dokładnie takie same, najlepszą praktyką jest to, że jedna opublikowana jako ostatnia usuwa swoją odpowiedź (chociaż jeśli dwie osoby posiadające dokładnie tę samą odpowiedź i stwierdzą, że są od siebie niezależne, mogą zachować obie; większość usuń odpowiedź, jeśli mają dokładnie to samo, co ktoś, kto opublikował wcześniej). Ale w różnych językach nie ma problemu. Witamy w PPCG! :)
Kevin Cruijssen
1

Python 2 ,  80  78 bajtów

Prawdopodobnie wciąż istnieją tutaj możliwości gry w golfa

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

Nienazwany funkcja przyjmując dwie liczby całkowite, si e, co zwraca szczotkowanie wymiarze godzin.

Wypróbuj online!

Jonathan Allan
źródło
0

Czysty , 134 128 126 bajtów

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

Wypróbuj online!

Definiuje funkcję $ :: Int Int -> Int, która właśnie znajduje odległość między dwoma zębami jako współrzędne kartezjańskie. Naprawdę nudne rozwiązanie.

Obrzydliwe
źródło