Прошло много времени с тех пор, как вы убили эту гидру , вы годами грелись в славе, но теперь люди зовут вас вымытыми. Что ж, пришло время доказать, что они не правы, вы слышали о местонахождении другой гидры. Просто убейте его, и вы получите всю славу, которую заслуживаете.
Вы прибываете в арсенал, чтобы получить свои мечи, но все они из обычных мечей, все, что у них осталось, это Секторы. N-сектор разделит число голов гидры на n, но может использоваться только в том случае, если количество голов делится на n.
Еще раз вы собираетесь написать код, который поможет вам убить гидру. Ваш код будет принимать в качестве входных данных число голов гидры, с которых начинается бой, количество голов гидры растет с каждым ходом и список n-секторов, которые вы можете использовать. Ваш код выведет оптимальную схему ходов, чтобы убить гидру как можно быстрее
Каждый ход боя вы можете выбрать один меч для использования, если после среза у гидры есть только одна голова, которую вы выигрываете, если нет, у нее вырастают головы. Вы можете никогда не сделать ход, и если нет доступных ходов, вы потеряете.
Если решение невозможно, вы можете вывести что-либо кроме решения, например, пустой список, ничего, ноль и т. Д.
Это код-гольф, поэтому ответы будут оцениваться по мере подсчета байтов, при этом меньше будет лучше.
Контрольные примеры
Вот несколько супер базовых тест-кейсов, по запросу будет добавлено больше тест-кейсов.
24 heads, 1 heads per turn, [2,3] -> [3,3,2,3]
25 heads, 2 heads per turn, [2,3] -> No solutions
4 heads, 2 heads per turn, [2] -> No solutions
4 heads, 3 heads per turn, [2,5] -> [2,5]
10 heads, 17 heads per turn, [2, 3, 7, 19] -> No solutions
10 heads, 6 heads per turn, [1,16] -> [1,16]
6 heads, 2 heads per turn, [2, 3, 5] -> [2, 5]
125 heads, 1 head per turn, [1, 2, 3, 127] -> [1, 1, 127]
Ответы:
JavaScript (ES6),
111105 байтСохранено 4 байта благодаря @ThePirateBay
Я отбросил рекурсию первой глубины, которую я пытался использовать для более безопасных петель первой ширины. Выводит решение в виде массива, если оно существует, работает вечно, если его нет. Если это недопустимо, вот тот, который в конечном итоге останавливается (в большинстве случаев, во всяком случае):
источник
JavaScript,
191190 байтСпас байт благодаря Step Hen
источник
Python 2 ,
169195222 байта+26 байт для правильной обработки циклической регенерации головы при неудачном выборе оружия. (Спасибо @ThePirateBay за указание на это)
+27 байт, чтобы исправить некоторые крайние случаи, вызывающие ошибки.
Попробуйте онлайн!
источник
VB.NET (.NET 4.5), 439 + 35 (импорт) = 474 байта
требует
Imports System.Collections.Generic
Функция
Z
принимает дваInt64
(число головок и скорость повторного роста головок) и aList(Of Int64)
(секторы) и возвращаетList(Of Int64) (the ordered choice of Sectors). Returns
Nothing`, если решения не существует.Предполагается, что сектора представлены в отсортированном порядке от наибольшего к наименьшему.
Эти
Optional
параметры являются рекурсивными вызовами для сохранения состояния. Они отслеживают текущий порядок использования Секторов, самый короткий порядок Секторов за все время и количество когда-либо встреченных голов. Если мы снова столкнемся с таким же количеством голов, должен был быть более короткий путь к нему.Единственный порядок Секторов, который имеет значение, это то, что я должен
1
быть последним, если он существует. В противном случае гидра может расти без границ, потому что я мог бы на каждом шагу просто использовать1
Сектор и никогда не пробовать другой.Я объявил константу
N
для представленияNothing
, сбрасывая 6 байтов каждый раз, когда я хотел использоватьNothing
.And
/Or
не являются короткими замыканиями, поэтому я использую условный оператор null (?.
), чтобы избежать ошибок null объекта. В реальном коде я бы использовалAndAlso
/OrElse
которые делают короткое замыкание.Попробуйте онлайн!
Z
не-гольф для удобства чтенияисточник