Зубна щітка, що подорожує


10

Вступ

Сьогоднішній виклик стосується зубів. Зокрема, скільки часу потрібно чистити від одного зуба до іншого. Ваше завдання полягає в тому, що, враховуючи розташування двох зубів, виведіть найкоротший проміжок часу для чищення від першого до другого.

Виклик

Для цього виклику ми будемо використовувати макет середнього дорослого людського рота:

Макет рота людини.

На цій діаграмі показана широко застосовувана система нумерації ISO . Система розділяє рот на чотири частини і присвоює їм кожне число: верхній правий (1), верхній лівий (2), лівий нижній (3) та нижній правий (4). Потім вони нумерують зуби кожного відділу від середини рота з 1-8. Тому четвертим зубом від центру у верхній правій частині (розділ 1) є зуб №14.

Припустимо, чистка одного зуба займає 1 одиницю часу. Переміщення від одного зуба до іншого набік займає 0 одиниць часу. Ви також можете переходити від зуба до зуба безпосередньо над або під ним, що також займає 1 одиницю часу. Отже, скільки часу вам потрібно чистити від зуба 14 до зуба 31? Переглянувши діаграму вище, ви побачите, що це займає 7 одиниць часу. Ось як це обчислюється:

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

Зауважте, він не єдиний маршрут, який ми могли пройти, але коротших маршрутів немає.

Тож ваше завдання:

  • Ви напишете повну програму або функцію, яка приймає два аргументи, що є числами зубів, і виводить (або повертає) найкоротший час для чищення від одного до іншого.
  • Ви вносите введення цифр або рядків і виводите як завгодно ( у межах прийнятних методів ).
  • Стандартні лазівки за замовчуванням заборонені.
  • Це питання є , тому найкоротші виграші на рахунку.
  • Ось кілька тестів ( спасибі Джонатану Аллану ):

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

Удачі!


1
@JonathanAllan додасть, коли я повернусь до свого комп’ютера.
Амфібологічний

1
"Перехід від зуба до зуба займає 0 одиниць часу." <- Точніше, я вважаю, що ви маєте на увазі "Перехід від одного зуба до іншого збоку займає 0 одиниць часу". (Я спершу
вважав

@sundar ти маєш рацію, буде редагувати.
Амфібологічний

1
@JonathanAllan зроблено.
Амфібологічний

Відповіді:


3

Желе ,  24  20 байт

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

Монадична посилання, що приймає список з двох цілих чисел (наприклад, [14,31]для прикладу від 14 до 31), що дає час чищення.

Спробуйте в Інтернеті!


Попередні 24 байтри вбудували рот і використовували базу 8, вхід являв собою список списків цифр:

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

5

JavaScript (ES6), 65 байт

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

Приймає введення як рядки.



1

JavaScript (ES6), 67 байт

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

Очікує введення у вигляді двох двоелементних масивів цифр. 12-> [1, 2]Я сподіваюся, що це прийнятно.

Спробуйте в Інтернеті!

Виглядає як близький дублікат відповіді Python @Chas Брауна , тому я можу її видалити за необхідності (тут не впевнені).

Пояснення

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
" Схоже, що це майже копія відповіді на відповідь Python @Chas Брауна, тому я можу видалити її у разі необхідності (не впевнені в умовах тут). " Оскільки вони є різними мовами, вони можуть залишатися. Тільки якщо два відповіді на одній і тій же мові є абсолютно однаковим, найкраще практика, коли одна, яка розміщена останньою, видалила свою відповідь (хоча якщо двоє людей, які мають абсолютно однакову відповідь, і вони вважають це незалежним один від одного, їм дозволяється зберігати обидва; більшість будуть видаліть їх відповідь, якщо вони точно такі, як хтось, хто раніше розмістив повідомлення). Але з різними мовами немає жодної проблеми. Ласкаво просимо до PPCG! :)
Кевін Круїссен


0

Очистити , 134 128 126 байт

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

Спробуйте в Інтернеті!

Визначає функцію $ :: Int Int -> Int, яка просто знаходить відстань між двома зубами як декартові координати. Досить нудне рішення насправді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.