Lo spazzolino da viaggio


10

introduzione

La sfida di oggi riguarda i denti. In particolare, quanto tempo ci vuole per spazzolare da un dente all'altro. La tua sfida è, date le posizioni di due denti, produrre il minor tempo possibile per spazzolare dal primo al secondo.

Sfida

Per questa sfida useremo un layout di una bocca umana adulta media:

Layout della bocca umana.

Questo diagramma mostra il sistema di numerazione ISO ampiamente utilizzato . Il sistema divide la bocca in quattro parti e assegna a ciascuna un numero: in alto a destra (1), in alto a sinistra (2), in basso a sinistra (3) e in basso a destra (4). Quindi numerano i denti di ogni sezione dal centro della bocca fuori da 1-8. Pertanto il quarto dente dal centro nella parte in alto a destra (sezione 1) è il numero 14 del dente.

Supponiamo che lavarsi un dente richieda 1 unità di tempo. Passare da un dente all'altro lateralmente richiede 0 unità di tempo. Puoi anche passare da un dente al dente direttamente sopra o sotto di esso, il che richiede anche 1 unità di tempo. Quindi quanto tempo impieghi a spazzolare dal dente 14 al dente 31? Guardando il diagramma sopra, vedrai che ci vogliono 7 unità di tempo. Ecco come viene calcolato:

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

Nota che il suo non è l'unico percorso che avremmo potuto prendere, ma non ci sono percorsi più brevi.

Quindi la tua sfida è:

  • Scriverai un programma o una funzione completa che accetta due argomenti che sono numeri di denti e restituisce (o restituisce) il tempo più breve per passare da uno all'altro.
  • Prendi input come numeri o stringhe e produci quanto desideri ( con metodi accettabili ).
  • Le scappatoie standard sono vietate per impostazione predefinita.
  • Questa domanda è , quindi vince il numero di byte più breve.
  • Ecco alcune prove ( grazie Jonathan Allan ):

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

In bocca al lupo!


1
@JonathanAllan aggiungerà quando torno sul mio computer.
Anfibologico,

1
"Il passaggio da un dente all'altro richiede 0 unità di tempo." <- Più precisamente, penso che intendi "Passare da un dente all'altro lateralmente richiede 0 unità di tempo". (L'ho preso per prima cosa significa che passare da un dente all'altro ha bisogno di 1 unità, il che ha reso la frase successiva confusa.)
Sundar - Reinstata Monica il

@sundar hai ragione, modificherò.
Anfibologico,

1
@JonathanAllan fatto.
Anfibologico,

Risposte:


3

Gelatina ,  24  20 byte

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

Un collegamento monadico che accetta un elenco di due numeri interi (ad esempio [14,31]per l' esempio da 14 a 31) che fornisce il tempo di spazzolatura.

Provalo online!


24 byte precedenti hanno costruito la bocca e utilizzato la base 8, l'input era un elenco di elenchi di cifre:

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

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

Accetta input come stringhe.



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

Prevede input come due matrici di 2 elementi di cifre. 12-> [1, 2]Spero sia accettabile.

Provalo online!

Sembra quasi un duplicato della risposta Python di @Chas Brown , quindi posso rimuoverlo se necessario (non sono sicuro delle convenzioni qui).

Spiegazione

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

2
" Sembra quasi un duplicato della risposta Python di @Chas Brown, quindi posso rimuoverlo se necessario (non sono sicuro delle convenzioni qui). " Dato che sono lingue diverse, entrambi possono rimanere. Solo se due risposte nella stessa lingua sono esattamente uguali, è consigliabile che l'ultima pubblicata abbia eliminato la propria risposta (anche se se due persone hanno la stessa identica risposta e l'hanno trovata indipendente l'una dall'altra, sono autorizzate a conservare entrambe; la maggior parte lo farà elimina la loro risposta se hanno esattamente lo stesso di qualcuno che ha postato prima, però). Ma con lingue diverse non c'è problema. Benvenuti in PPCG! :)
Kevin Cruijssen,

1

Python 2 ,  80  78 byte

Probabilmente alcune opportunità di golf qui ancora

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 funzione senza nome che accetta due numeri interi se eche restituisce il tempo di spazzolatura.

Provalo online!


0

Pulito , 134 128 126 byte

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

Provalo online!

Definisce la funzione $ :: Int Int -> Int, che trova semplicemente la distanza tra i due denti come coordinate cartesiane. Soluzione davvero noiosa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.