описание проблемы
Мы все любим твикс (потому что это самая лучшая конфета), но это первый детский праздник Хэллоуина - нам нужно захватить хотя бы одну конфету каждого типа для них. Каждый Хэллоуин все жители Numberline avenue рассылают электронные письма, в которых говорится, какие конфеты они будут разыгрывать в этом году.
Ой! И мы живем в одномерном мире.
Будучи исключительно ленивыми в некоторых отношениях, а не в других, мы составили карту домов, на которых показано их расположение вдоль улицы. Мы также отметили типы конфет, которые они имеют. Вот карта, которую мы сделали на этот год:
[(-2, {"Kisses", "KitKats"}),
(1, {"KitKats", "Peanut Butter Cups"}),
(6, {"Kisses", "Twix"}),
(9, {"Skittles"}),
(10, {"Twix"})]
Ради маленьких ножек детей нам нужно найти кратчайшую прогулку, начиная с любого дома по соседству, чтобы собрать как минимум по одному конфету каждого типа.
Примеры
По просьбе нескольких пользователей (включая Shaggy) я приведу несколько проработанных примеров. Надеюсь, это прояснит ситуацию. :) Вход:
[(-2, {"Kisses", "KitKats"}),
(1, {"KitKats", "Peanut Butter Cups"}),
(6, {"Kisses", "Twix"}),
(9, {"Skittles"}),
(10, {"Twix"})]
Вывод:
[1, 2, 3]
Еще одна карта и решение ...
Входные данные:
[(-3, {"KitKats", "Twix"}),
(-1, {"Hundred Grands"}),
(3, {"Kisses"}),
(12, {"Hundred Grands", "Twix", "KitKats"})]
Выход :
[0, 1, 2]
Мы могли бы начать в доме с координатами 9, собирая конфеты в дома 6 и 1. Это заполняет квоту на конфеты, пройдя 8 единиц, но является ли это кратчайшим решением?
правила
Записи должны принимать аналогично структурированному единственному аргументу к примеру и выводить индексы домов для посещения в кратчайшем решении.
Применяются типичные правила игры в гольф: выигрывает самое короткое правильное решение в байтах!
PS Это был вопрос для интервью, данный мне одной из крупнейших мировых технологических компаний. Если вам не нравится гольф, попробуйте найти временное решение O (k * n), где k - количество конфет, а n - количество домов.
редактировать
Как отметил Джонатон Аллан, существует некоторая путаница в отношении того, что в данном случае означают «индексы». Мы хотим вывести позиции домов в списке аргументов, а не их координаты на дорожке.
Ответы:
Желе , 16 байт
Монадическая ссылка, принимающая входные данные, как описано в списке, отсортированном от дома с самым низким номером до самого высокого (если нам нужно принять любой порядок, который мы можем добавить
Ṣ
), который дает кратчайший путь, начиная с дома с самым низким номером и продвигаясь вверх по проспекту.Попробуйте онлайн!
Если мы хотим найти все такие кратчайшие пути, заменим конечные байты
ÞḢ
наÐṂ
; это также 16 байтов.Как?
источник
Python 2 ,
133130127 байтПопробуйте онлайн!
источник
05AB1E , 22 байта
Предполагается, что числа в списке ввода отсортированы по возрастанию.
Если найдено более одного решения, оно выведет их все.
Попробуйте онлайн.
Объяснение:
источник
Perl 6 , 70 байт
Попробуйте онлайн!
источник
Haskell ,
343372 байтаБлагодаря @ ASCII-only для улучшений, есть также 271-байтовый вариант, который он предложил в комментариях :)
Попробуйте онлайн!
Ungolfed
Первая попытка
источник
O (k * n) временное решение, с O (k * n) пространством
Таким образом, наш алгоритм:
источник