Sikat Gigi Bepergian

10

pengantar

Tantangan hari ini adalah soal gigi. Secara khusus, berapa lama untuk menyikat dari satu gigi ke gigi lainnya. Tantangan Anda adalah, mengingat lokasi dua gigi, menghasilkan waktu sesingkat mungkin untuk menyikat dari yang pertama ke yang kedua.

Tantangan

Untuk tantangan ini kita akan menggunakan tata letak mulut manusia dewasa rata-rata:

Layout mulut manusia.

Diagram ini menunjukkan sistem penomoran ISO yang banyak digunakan . Sistem membagi mulut menjadi empat bagian dan memberikan nomor masing-masing: kanan atas (1), kiri atas (2), kiri bawah (3), dan kanan bawah (4). Mereka kemudian memberi nomor gigi setiap bagian dari tengah mulut keluar dari 1-8. Oleh karena itu gigi keempat dari tengah di sisi kanan atas (bagian 1) adalah gigi nomor 14.

Mari kita asumsikan menyikat satu gigi membutuhkan 1 unit waktu. Pindah dari satu gigi ke gigi berikutnya membutuhkan waktu 0 unit. Anda juga dapat berpindah dari satu gigi ke gigi lainnya langsung di atas atau di bawahnya, yang juga membutuhkan waktu 1 unit. Jadi berapa lama Anda menyikat dari gigi 14 ke gigi 31? Dengan melihat diagram di atas, Anda akan melihatnya butuh 7 unit waktu. Berikut ini cara penghitungannya:

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

Perhatikan bahwa ini bukan satu-satunya rute yang bisa kita ambil, tetapi tidak ada rute yang lebih pendek.

Jadi tantangan Anda adalah:

  • Anda akan menulis program atau fungsi lengkap yang menerima dua argumen yang merupakan nomor gigi, dan menghasilkan (atau mengembalikan) waktu tersingkat untuk menyikat dari satu ke yang lain.
  • Anda membuat masukan sebagai angka atau string, dan hasilkan sesuka Anda ( dengan metode yang dapat diterima ).
  • Celah standar dilarang secara default.
  • Pertanyaan ini adalah , sehingga bytecount terpendek menang.
  • Berikut adalah beberapa testcases ( Terima kasih Jonathan Allan ):

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

Semoga berhasil!

Amfibologis
sumber
1
@JonathanAllan akan menambahkan ketika saya kembali ke komputer saya.
Amfibologis
1
"Pindah dari gigi ke gigi membutuhkan 0 unit waktu." <- Lebih tepatnya, kupikir maksudmu "Bergerak dari satu gigi ke samping berikutnya membutuhkan 0 unit waktu". (Saya pertama kali mengartikan bahwa pindah dari gigi mana saja ke yang lain membutuhkan 1 unit, yang membuat kalimat berikutnya membingungkan.)
sundar - Reinstate Monica
@sundar Anda benar, akan diedit.
Amfibologis
1
@ Jonathan Allan selesai.
Amfibologis

Jawaban:

3

Jelly ,  24  20 byte

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

Tautan monadik yang menerima daftar dua bilangan bulat (misalnya [14,31]untuk dari 14 hingga 31 contoh) yang menghasilkan waktu menyikat.

Cobalah online!


Sebelumnya 24 byter membangun mulut dan menggunakan basis 8, input adalah daftar daftar digit:

8R;C$C+⁴U,+ɗ⁴
ḅ8¢œiⱮạ/Ḅ‘
Jonathan Allan
sumber
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

Mengambil input sebagai string.

Neil
sumber
1

Python 2 , 91 byte

def f(a,b):A,B=a/10,b/10;return[abs(a-b)%10+1+2*(A!=B),a%10+b%10+2-(A+B)%2*2][A!=B!=A+B!=5]

Cobalah online!

Chas Brown
sumber
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

Mengharapkan input sebagai dua array elemen 2 digit. 12-> [1, 2]Saya harap ini bisa diterima.

Cobalah online!

Sepertinya hampir duplikat ke jawaban Python @Chas Brown , jadi saya bisa menghapusnya jika perlu (tidak yakin dengan konvensi di sini).

Penjelasan

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
redundansi
sumber
2
" Sepertinya duplikat dekat dengan jawaban Python @Chas Brown, jadi saya bisa menghapusnya jika perlu (tidak yakin dengan konvensi di sini). " Karena mereka berbeda bahasa keduanya mungkin tetap. Hanya jika dua jawaban dalam bahasa yang sama persis sama, praktik terbaik yang satu diposting terakhir menghapus jawaban mereka (meskipun jika dua orang memiliki jawaban yang sama persis dan mereka merasa independen satu sama lain mereka diizinkan untuk mempertahankan keduanya; sebagian besar akan hapus jawaban mereka jika mereka memiliki jawaban yang sama persis dengan seseorang yang diposting lebih cepat). Tetapi dengan berbagai bahasa tidak ada masalah. Selamat datang di PPCG! :)
Kevin Cruijssen
1

Python 2 ,  80  78 byte

Mungkin masih ada beberapa peluang bermain golf

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

Fungsi yang tidak disebutkan namanya menerima dua bilangan bulat, sdan e, yang mengembalikan waktu menyikat.

Cobalah online!

Jonathan Allan
sumber
0

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

Cobalah online!

Menentukan fungsi $ :: Int Int -> Int, yang hanya menemukan jarak antara dua gigi sebagai koordinat Kartesius. Solusi yang sangat membosankan.

Suram
sumber