Вам дали мешок с кеглями. Всем известно, что для того, чтобы оценить различные вкусы, вам нужно вращаться между ароматами.
Основы:
- Вы можете съесть только 1 кегель за раз
- Порядок, в котором вы едите свои кегли, должен быть периодическим.
- Каждый период не может содержать определенный аромат более одного раза.
- В вашей сумке столько кеглей. Вы не можете съесть больше особенного аромата кегли, чем появляется в вашей сумке.
- Вы хотите съесть как можно больше кегли (это не всегда возможно)
Примеры:
Допустим, вы начинаете с 3 красных, 2 синих и 3 зеленых кеглей:
R B G R B G R G Invalid: The last R must be followed by a B, not a G
R B G R B G R Valid, but sub-optimal
R R R Valid, but sub-optimal
R G B R G B R G Valid and optimal
G R B G R B G R Also valid and optimal (there are multiple good solutions)
Ввод, вывод
- Вам передан непустой список натуральных чисел для подсчета цвета. (Приведенный выше пример будет
[3,2,3]
). - Вам необходимо вернуть список, содержащий действительный и оптимальный порядок.
- Вместо использования цветов вы будете использовать индексы из списка ввода. (Последний пример выходных данных будет
[2,0,1,2,0,1,2,0]
). - Ваш вывод может быть 0-индексирован или 1-индексирован. Мои примеры будут 0-проиндексированы
Тестовые случаи
1 0
4 0 0 0 0
4 1 0 0 0 0
3 1 0 1 0 or 0 0 0
5 2 2 0 1 2 0 1 2 0
2 3 5 2 1 0 2 1 0 2 1 or 1 2 0 1 2 0 1 2
2 4 5 2 1 2 1 2 1 2 1 2
3 4 5 2 1 0 2 1 0 2 1 0 2 1 or 1 2 0 1 2 0 1 2 0 1 2
1 1 1 1 1 6 5 0 1 2 3 4 5 (lots of other solutions)
1 1 1 1 1 8 5 5 5 5 5 5 5 5
2 4 6 8 3 2 1 3 2 1 3 2 1 3 2 1 3 2
Это код-гольф , поэтому делайте ваши решения как можно короче на своем любимом языке!
Ответы:
JavaScript (ES6),
177175 байтОтформатировано и прокомментировано
Используемая формула
Ниже приведена таблица, показывающая, как работает формула
F(i, j) = minimum(value[j], value[i] + 1)
, здесьi = 0
и ввод[ 5, 2, 2 ]
.Эту формулу можно интерпретировать следующим образом: для каждого типа Skittle мы можем выбрать не более числа наименее доступного типа плюс один.
Контрольные примеры
Показать фрагмент кода
источник
m
нахождение в конце «петель» вызванным гольфом, или это просто как JS?m=0
здесь связано с гольфом, потому что меня не волнует начальное значение этого цикла (оно все равно будет перезаписано). Инициализацияm
там удобна.[1,2,3].reduce((x, y) => x+y, 10)
в JS будетreduce(lambda x,y: x+y, [1,2,3], 10)
в Python (я думаю), оба в результате16
.Желе , 22 байта
Индексирование на основе 1.
Попробуйте онлайн!
Как?
Повторяет каждый префикс индексов, отсортированных по значению по убыванию, еще один раз, чем это было бы возможно с данной сумкой кеглей, затем удаляет финальные кегли или кегли из каждого из них по мере необходимости, чтобы сделать их достижимыми, и возвращает тот, у которого больше всего кеглей ,
Число, которое должно быть удалено из одного дополнительного периодического повторения, это просто число с минимальным количеством для этого префикса.
источник
python3,
174172167 байтидея
Например, с 3 красными, 2 синими и 3 зелеными кеглями можно расположить их в сетке, отсортировав по цвету и количеству:
Если кто-то пытается съесть ровно кегли, можно, по крайней мере, съесть кегли i * c, где c - количество кеглей в r-м столбце, например, для i = 2 можно, по крайней мере, съесть 6 кеглей.
Осталось только подсчитать, сколько дополнительных кеглей можно съесть за неполный период.
Golfed
комментарии
Попробуйте онлайн!
Редактировать: заменено
(i+1)
на-~i
чтобы сохранить 2 байта.Редактировать: -5 байт благодаря Мертвому Опоссуму
источник
sum(1for e in b if e[0]>c)
наsum(c<e[0]for e in b)
. Это будет преобразовывать True в 1 неявно и сэкономит вам 5 байтов