Введение
Сегодняшняя проблема - все о зубах. В частности, сколько времени нужно, чтобы почистить зубы от одного до другого. Ваша задача состоит в том, чтобы, учитывая расположение двух зубов, вывести кратчайшее время, необходимое для чистки от первого до второго.
Вызов
Для этой задачи мы будем использовать макет среднего рта взрослого человека:
Эта диаграмма показывает широко используемую систему нумерации 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
Удачи!
Ответы:
Желе ,
2420 байтМонадическая ссылка, принимающая список из двух целых чисел (например,
[14,31]
для примера от 14 до 31), который дает время чистки.Попробуйте онлайн!
Предыдущие 24 байта строили рот и использовали базу 8, входные данные представляли собой список списков цифр:
источник
JavaScript (ES6), 65 байт
Принимает ввод как строки.
источник
Python 2 , 91 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 67 байт
Ожидает входные данные в виде двух 2-элементных массивов цифр.
12
->[1, 2]
Я надеюсь, что это приемлемо.Попробуйте онлайн!
Выглядит как почти дубликат с ответом Python @Chas Brown , так что я могу удалить его при необходимости (неуверен в соглашениях здесь).
объяснение
источник
Python 2 ,
8078 байтВероятно, некоторые возможности для игры в гольф здесь все еще
Безымянная функция, принимающая два целых числа,
s
иe
, которая возвращает время чистки.Попробуйте онлайн!
источник
Чистый ,
134128126 байтовПопробуйте онлайн!
Определяет функцию
$ :: Int Int -> Int
, которая просто находит расстояние между двумя зубцами как декартовы координаты. Довольно скучное решение на самом деле.источник