... подсчитаны!
Вы передадите своей программе переменную, которая представляет количество денег в долларах и / или центах и массив значений монет. Ваша задача состоит в том, чтобы вывести количество возможных комбинаций данного массива монет, которые бы составили сумму, переданную в код. Если это невозможно с названными монетами, программа должна вернуться 0
.
Примечание по американской нумизматической терминологии:
- Монета в 1 цент: пенни
- Монета 5 центов: никель
- Монета 10 центов: 10 центов
- Монета 25 центов: четверть (четверть доллара)
Пример 1:
Программа пройдена:
12, [1, 5, 10]
(12 центов)
Выход:
4
Существует 4 возможных способа объединения названных монет для получения 12 центов:
- 12 копеек
- 1 никель и 7 копеек
- 2 никеля и 2 копейки
- 1 копейка и 2 копейки
Пример 2:
Программа пройдена:
26, [1, 5, 10, 25]
(26 центов)
Выход:
13
Существует 13 возможных способов объединения названных монет для получения 26 центов:
- 26 копеек
- 21 копейка и 1 никель
- 16 копеек и 2 никеля
- 11 копеек и 3 никеля
- 6 копеек и 4 никеля
- 1 копейка и 5 никелей
- 16 копеек и 1 цент
- 6 копеек и 2 цента
- 11 копеек, 1 цент и 1 никель
- 6 копеек, 1 цент и 2 никеля
- 1 копейка, 1 цент и 3 никеля
- 1 пенни, 2 цента и 1 никель
- 1 четверть и 1 копейка
Пример 3:
Программа пройдена:
19, [2, 7, 12]
Выход:
2
Существует 2 возможных способа объединения названных монет для получения 19 центов:
- 1 монета за 12 центов и 1 монета за 7 центов
- 1 монета 7 центов и 6 монет 2 цента
Пример 4:
Программа пройдена:
13, [2, 8, 25]
Выход:
0
Не существует возможных способов объединения названных монет для получения 13 центов.
Это было через Песочницу. Применяются стандартные лазейки. Это код гольф, поэтому ответ с наименьшим количеством байтов выигрывает.
источник
s/count/earn
.Ответы:
Желе ( вилка ), 2 байта
Это опирается на ветку Jelly, где я работал над реализацией Frobenius для решения атомов, поэтому, к сожалению, вы не можете попробовать это онлайн.
использование
объяснение
источник
Haskell,
3734 байтаПример использования:
26 # [1,5,10,25]
->13
.Простой рекурсивный подход: попробуйте следующее число в списке (если оно меньше или равно количеству) и пропустите его. Если вычитание числа приводит к нулю, возьмите
1
еще (или, если в списке нет элементов), возьмите0
. Суммируйте те1
с и0
с.Редактировать: @Damien: сохранил 3 байта, указав на более короткий базовый вариант для рекурсии (который также можно найти в ответе @xnors ).
источник
1209 # [1,5,10,33,48]
->1314050
.6000 # [1,5,10,33]
->22086484
.Mathematica,
3522 байтаСпасибо милям за предложение
FrobeniusSolve
и сохранение 13 байтов.Оценивает безымянную функцию, которая принимает список монет в качестве первого аргумента и целевое значение в качестве второго.
FrobeniusSolve
является сокращением для решения диофантовых уравнений видадля более неотрицательных целых чисел и дает нам все решения.
xi
источник
(Length@*FrobeniusSolve)[{1, 7, 9}, 18]
Pyth, 8 байт
Сырая грубая сила, слишком большая память для реального тестирования. Это O (2 mn ), где n - количество монет, а m - целевая сумма. Принимает вход как
target\n[c,o,i,n,s]
.источник
Haskell, 37 байт
Использование некоторого кратного первой монеты
h
уменьшает требуемую суммуs
до неотрицательного значения в убывающей прогрессии[s,s-h..0]
, что затем должно быть сделано с оставшимися монетами. Как только не останется монет, проверьте, что сумма равна нулю арифметически0^s
.источник
JavaScript (ES6),
5148 байтПринимает монеты в любом порядке. Пытается использовать и не использовать первую монету, рекурсивно вычисляя количество комбинаций в любом случае.
n==0
означает соответствующую комбинацию,n<0
означает, что количество монет превышает количество, аc==undefined
означает, что монет больше не осталось. Обратите внимание, что функция очень медленная, и если у вас есть монета на пенни, то следующая функция работает быстрее (не передавайте монету в копилке):источник
Perl, 45 байт
Количество байтов включает 44 байта кода и
-p
флага.Принимает значения монет в первой строке и целевую сумму во второй строке:
Краткие объяснения:
источник
Желе ,
109 байтПопробуйте онлайн!
Как?
источник
JavaScript (ES6), 59 байт
Монеты вводятся от высшего к низшему, например
f(26,[100,25,10,5,1])
. Если у вас есть пенни, удалите его и используйте вместо этого эту более быструю версию:Здесь используется рекурсивная формула, очень похожая на @ nimi. Первоначально я написал это несколько дней назад, когда проблема была еще в песочнице; это выглядело так:
Единственное отличие состоит в значении по умолчанию
c
(оно имело заданное значение в исходном вызове) и изменении0
в.reduce
функции на1
(это было на два байта короче и в несколько миллиардов раз быстрееc=[100,25,10,5,1]
).Вот модифицированная версия, которая выводит все комбинации, а не количество комбинаций:
источник
PHP, 327 байт
Попытайся
источник
Аксиома,
6362 байта1 байт сохранен @JonathanAllan
Этот подход использует производящие функции. Возможно, это не помогло уменьшить размер кода. Я думаю, что это первый раз, когда я играю с Аксиомой, я дошел до определения своей собственной функции.
При первом вызове функции она выдаёт ужасное предупреждение, но все равно дает правильный результат. После этого все в порядке, пока список не пуст.
источник
for
?R,
817663 байтаСпасибо @rturnbull за 13-байтовую игру в гольф!
Пример (обратите внимание, что
c(...)
вы передаете векторы значений в R):Объяснение:
u
желаемое значение,v
вектор значений монет.создает фрейм данных с каждой возможной комбинацией от 0 до k монет (k зависит от достоинства), где k - это наименьшее значение, так что k раз значение этой монеты равно по меньшей мере u (значение, которое нужно достичь).
Обычно мы используем это,
as.matrix
чтобы превратить это в матрицу, но это много символов. Вместо этого мы берем транспонирование транспонирования (!), Которое автоматически вызывает его, но принимает меньше символов.%*% v
затем рассчитывает денежную стоимость каждой строки. Последний шаг - подсчитать, сколько из этих значений равно желаемому значению.u
.Обратите внимание, что сложность вычислений и требования к памяти ужасны, но эй, это код игры в гольф.
источник
expand.grid
! И я люблюt(t())
трюк. Поскольку ваша функция содержит только одну строку кода, вы можете удалить фигурные скобки, сэкономив вам 2 байта. Кроме того, вы можете переключитьсяdo.call(expand.grid,lapply(u/v,seq,from=0))
на простоexpand.grid(lapply(u/v,seq,f=0))
, экономя 11 байтов.expand.grid
будет принимать список в качестве входных данных. Немного обидно, что":"
плохо работает с нецелыми числами, иначеlapply(u/v,":",0)
спас бы еще пару.do.call(x,y)
так же, какx(y)
, так что это не о том, какие виды ввода принимаются. Если вы действительно хотите использовать:
, я думаю, вы могли бы использоватьlapply(u%/%v,`:`,0)
, но это тот же счетчик байтов.do.call(x,y)
то же самое, что иx(y)
" --- только еслиy
это не список, как в данном случае. Согласитесь с вашим вторым пунктом, хотя.J, 27 байт
использование
объяснение
источник
TSQL, 105 байт
Это может обработать только один доллар с этими 4 типами монет. Версия без золота может обойтись примерно в 4 доллара, но очень медленно - на моем боксе это занимает 27 секунд. Результат 10045 комбинаций между прочим
Golfed:
Ungolfed:
скрипка
источник
тинилисп репл , 66 байт
Рекурсивное решение: пытается использовать первую монету, а не первую, затем добавляет результаты для каждой. Экспоненциальная сложность по времени и отсутствие хвостовой рекурсии, но она прекрасно вычисляет контрольные примеры.
Ungolfed (ключ к встроенным:
d
= определить,q
= кавычка,i
= если,l
= меньше, чем,s
= вычитать,h
= голова,t
= хвост):Пример использования:
источник
PHP, 130 байт
99-байтовая рекурсивная функция (и 31 байт ее вызова), которая многократно удаляет значение текущей монеты из цели и вызывает себя с новым значением и другими монетами. Подсчитывает, сколько раз цель достигает 0 точно. Беги как:
источник
Ракетка 275 байтов
Ungolfed:
Тестирование:
Выход:
Следующее рекурсивное решение имеет некоторую ошибку:
Не работает должным образом для:
Выход:
(1 1 3 3) возможно, но не входит в список решений.
источник
reduce
Scheme
( groups.csail.mit.edu/mac/projects/scheme ), что в итоге привело к полномасштабномуRacket
( racket-lang.org , stackoverflow.com/questions/3345397/… )!Желе , 15 байт
Попробуйте онлайн! или Проверьте все контрольные примеры.
Это было больше упражнение в написании эффективной версии в Jelly без использования встроенных функций. Это основано на типичном подходе динамического программирования, который используется для расчета количества способов внесения изменений.
объяснение
источник
На самом деле , 15 байтов
Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Python, 120 байт
Brutefor через все комбинации монет до целевого значения (даже если самая маленькая не 1).
источник