Фон
Официальная валюта мнимой нации Golfenistan является Foo , и есть только три вида монет в обращении: 3 Foos, 7 и 8 Foos Foos. Можно видеть, что с помощью этих монет невозможно заплатить определенную сумму, например 4 фо. Тем не менее, все достаточно большие суммы могут быть сформированы. Ваша задача - найти наибольшую сумму, которая не может быть сформирована монетами (в данном случае 5 фу), которая известна как проблема с монетами .
вход
Ваш ввод представляет собой список натуральных чисел, представляющих ценности монет в обращении. Об этом гарантированы две вещи:L = [n1, n2, ..., nk]
- GCD элементов
L
- 1. L
не содержит номер 1.
Он может быть несортированным и / или содержать дубликаты (например, монеты специального издания).
Выход
Поскольку GCD L
равен 1, каждое достаточно большое целое число m
может быть выражено как неотрицательная линейная комбинация его элементов; другими словами, мы имеем
m = a1*n1 + a2*n2 + ... + ak*nk
для некоторых целых чисел . Ваш вывод является наибольшим целым числом, которое не может быть выражено в этой форме. Как подсказка, известно, что выходные данные всегда меньше, чем , если и являются максимальными и минимальными элементами ( ссылка ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
правила
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Если ваш язык имеет встроенную операцию для этого, вы не можете использовать его. Нет никаких требований к времени или эффективности использования памяти, за исключением того, что вы должны быть в состоянии оценить тестовые примеры перед публикацией вашего ответа.
После того, как я опубликовал эту проблему, пользователь @vihan указал, что переполнение стека имеет точную копию . Основываясь на этой мета-дискуссии , эта задача не будет удалена как дубликат; тем не менее, я прошу, чтобы все ответы, основанные на ответах версии SO, содержали ссылки на оригиналы, имели статус Wiki сообщества и удалялись, если автор оригинала хочет опубликовать свой ответ здесь.
Тестовые случаи
[3, 7, 8] -> 5
[25, 10, 16] -> 79
[11, 12, 13, 14, 13, 14] -> 43
[101, 10] -> 899
[101, 10, 899] -> 889
[101, 10, 11] -> 89
[30, 105, 70, 42] -> 383
[2, 51, 6] -> 49
источник
FrobeniusNumber
в Mathematica.(p - 1)(q - 1)
верхнюю границу, гдеp
иq
являются наименьшим и наибольшим элементом множества.[2,3]
за разумное количество времени и ничего больше.[2,5]
создаст около миллиона списков Python в памяти.Ответы:
Pyth, 23 байта
Это очень медленно, так как проверяет все значения вплоть до произведения всех монет. Вот версия, которая почти идентична, но 1) уменьшает набор монет до тех, которые не делятся друг на друга, и 2) проверяет только значения до
(max(coins) - 1) * (min(coins) - 1)
(47 байт):объяснение
источник
Perl,
605451 байтКод 50 байтов + командная строка 1 байт
Продолжу игру в гольф и опубликую объяснение позже. Основной подход состоит в том, чтобы позволить механизму регулярных выражений выполнять тяжелую работу с сопоставлением строк. Например, он создаст регулярное выражение, подобное
^(.{3})*(.{7})*(.{8})*$
и сопоставленное со строкой длины,n
гдеn
спускается из произведения входных данных до тех пор, пока не будет найдено совпадение.Обратите внимание, что это будет становиться экспоненциально медленным по мере увеличения количества аргументов.
Использование: Аргументы считываются из STDIN (новая строка отделена), например:
источник
R ,
8478 байтПопробуйте онлайн!
outer
colSums
а не за "применить (..., 2, сумма)".Более быстрая, но более длинная (на два байта) версия учитывает только
max(a)
:Немного более короткая версия (78 байт) , который чаще всего занимает слишком войти или слишком много места , чтобы работать на Попробовать онлайн является
источник
Python2,
188187 байтВторой отступ отображается как 4 пробела на SO, это должны быть табуляции.
На самом деле «быстрое» решение, а не грубое, использует «метод Уилфа», как описано здесь .
источник
Javascript ES6,
120130126128127125 символовАльтернативная версия на 126 символов:
Тестовое задание:
источник
forEach(
сmap(