Вдохновение для этого кода гольф головоломки является проблема моста и факел , в котором г люди в начале моста все должны пересечь его в наименьшее количество времени.
Загвоздка в том, что максимум два человека могут пересекать одновременно, иначе мост сломается под их весом, и у группы будет доступ только к одному факелу, который нужно нести, чтобы пересечь мост.
У каждого человека во всей загадке есть определенное время, которое ему требуется, чтобы пройти через мост. Если два человека пересекаются вместе, пара идет так же медленно, как самый медленный человек.
Нет определенного количества людей, которые должны пересечь мост; Ваше решение ДОЛЖНО работать для любого значения d .
Вам не нужно использовать стандартный ввод для этой проблемы, но для объяснения проблемы я буду использовать следующий формат ввода и вывода для объяснения. Первое число, d , это количество людей в начале моста. Затем код отсканирует d чисел, каждое из которых представляет скорость человека.
Выводом кода будет наименьшее количество времени, необходимое для прохождения всех от начала моста до конца моста при соблюдении критериев, описанных ранее.
Вот некоторые входные случаи и выходные случаи и объяснение для первого входного случая. Это зависит от вас, чтобы извлечь алгоритм из этой информации, чтобы решить проблему с наименьшим количеством байтов кода.
вход
4
1 2 5 8
выход
15
Чтобы достичь этого результата, люди должны перейти следующим образом.
A and B cross forward (2 minutes)
A returns (1 minute)
C and D cross forward (8 minutes)
B returns (2 minutes)
A and B cross forward (2 minutes)
Вот еще один тестовый пример, который поможет вам на вашем пути.
вход
5
3 1 6 8 12
выход
29
Правила:
- Предположим, что входные данные не будут отсортированы, и вы должны сделать это самостоятельно (если вам нужно)
- Количество людей в головоломке не установлено на 4 (N> = 1)
- Каждая группа и индивидуальный переход должны иметь факел. Есть только один факел.
- Каждая группа должна состоять максимум из 2 человек!
- Нет, вы не можете спрыгнуть с моста и переплыть на другую сторону. Никаких других трюков, как это;).
1 3 4 5
, которые должны возвращать 14, а не 15.1 4 5 6 7
имеет похожую проблему. 25 против 26N >= 2
людьми (то есть, как ни странно, это дополнительная работа, чтобы разобраться с тривиальным случаем «1 человек должен пересечь»), поэтому некоторые пояснения по этому вопросу были бы хорошими. Заранее спасибо.Ответы:
Python 3,
10099 байтрекурсивное решение
Спасибо @xnor за эту статью
Благодаря @lirtosiast экономит 2 байта, @movatica сохраняет 1 байт и @gladed указывает на то, что мое предыдущее решение не работает
используйте следующий трюк для оценки чего-либо в лямбда-функции
s.sort() or s
здесь мы вычисляем sort и возвращаем результат тестаs.sort()or len(s)>3
Ungolfed
Результаты
источник
len(s)==2
наlen(s)<3
s[0]*(len(s)==2)
не(s[0]*len(s)==2)
из-за ошибкиf([1]) -> 0
, поэтому мы не можем заменить<3
благодарностьюA5:22
Python 2,
11911411211911010095 байтовМне посоветовали разделить мои ответы.
Решение с использованием
Theorem 1, A2:09
этой статьи XNOR связано . Чтобы процитировать статью (изменив ее на нулевую индексацию):The difference between C_{k-1} and C_k is 2*t_1 - t_0 - t_{N-2k}.
Ungolfing:
источник
Рубин,
9413397961019699 байтМне посоветовали разделить мои ответы.
Это решение на основе алгоритма , описанного в
A6:06-10
из этой бумаги на мосту и факелом проблемы .Редактировать: Исправление ошибки, когда
a=s[0]
еще не определено, когдаa
вызывается в конце, еслиs.size <= 3
.Ungolfing:
источник
Скала,
113135 (дарнит)В некотором роде
Tester:
Не очень хорошо, но, возможно, неплохо для строго типизированного языка. И благодарю xnor за то, что я обнаружил случай, который я не понял.
источник
Руби,
1049593 байтаМне посоветовали разделить мои ответы.
Это решение , основанное на моем решение Python 2 и
Theorem 1, A2:09
из этой бумаги на мосте и факел проблеме .Ungolfing:
источник