Problemem zmiana moneta jest bardzo dobrze udokumentowane. Biorąc pod uwagę nieskończoną dostaw nominałów monet x_1
do x_m
trzeba znaleźć liczbę kombinacji, które dodają do y
. Na przykład podane x = {1,2,3}
i y = 4
mamy cztery kombinacje:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
Wprowadzenie
Istnieje kilka odmian problemu zmiany monety. W tej odmianie mamy dwa dodatkowe ograniczenia:
- Każdy nominał musi być użyty co najmniej raz.
- W sumie należy użyć dokładnie określonej liczby monet.
Na przykład, biorąc pod uwagę x = {1,2,3}
, y = 36
a n = 15
gdzie n
jest to łączna liczba monet, które muszą być stosowane, otrzymujemy cztery kombinacje:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1 jedynki, 7 dwójek, 7 trójek){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2 jedynki, 5 dwójek, 8 trójek){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3 jedynki, 3 dwójki, 9 trójek){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4 jedynki, 1 dwójka, 10 trójek)
Wyzwanie
Wyzwanie polega na napisaniu funkcji enumerate
w wybranym języku, która wylicza wszystkie kombinacje zgodnie z powyższym opisem:
- Lista nominałów. Na przykład
{1,5,10,25}
. Możesz użyć list lub tablic. - Nieujemna liczba całkowita
y
oznaczająca sumę każdej kombinacji. - Nieujemna liczba całkowita
n
oznaczająca całkowitą liczbę monet.
Kolejność argumentów nie ma znaczenia. Funkcje pointfree są dozwolone.
Dane wyjściowe enumerate
funkcji musi być listą kombinacji. Każda kombinacja musi być unikalna i musi być listą n
liczb całkowitych, które się sumują y
. Każdy nominał musi pojawić się co najmniej raz w każdej kombinacji i nie może zabraknąć żadnej kombinacji. Kolejność liczb całkowitych i kombinacji nie ma znaczenia. Do danych wyjściowych można użyć list lub tablic.
Należy pamiętać o następujących przypadkach krawędzi:
- Jeśli oba
y
in
są zerowe, a lista nominałów jest pusty, to wyjście jest lista jednej kombinacji, pusty połączenie (tj{{}}
). - W przeciwnym razie, jeśli
y
wynosi zero,n
oznacza zero lub lista nominałów jest pusta, wówczas wynikiem jest lista zerowych kombinacji (tj{}
.). - Mówiąc bardziej ogólnie, jeśli
y
jest mniejsza niż suma nominałów lubn
jest mniejsza niż liczba nominałów, wówczas wynikiem jest lista zerowych kombinacji.
Punktacja będzie oparta na wielkości całego programu w bajtach. Pamiętaj, że obejmuje to enumerate
funkcję, funkcje pomocnicze, instrukcje importu itp. Nie obejmuje przypadków testowych.
źródło
y
jest mniejsza niż suma nominałów, to w pewnym momencie rozwiązania rekurencyjnego dojdziesz do przypadku podstawowego, w którym lista nominałów jest pusta. Dlatego odpowiedź będzie{}
(tzn. Nie znaleziono rozwiązania). Jeślin
jest mniejszy niż liczba nominałów, w końcu dojdziesz do przypadku podstawowego, gdzien = 0
aley != 0
. Zatem odpowiedź będzie znowu{}
.Odpowiedzi:
05AB1E, 20 bajtów
Wejście znajduje się w kolejności:
list of values
,nr of coins
,sum to reach
.Wyjaśnienie w skrócie
final length - length of unique coin list
Wypróbuj online
Internetowy kompilator nie obsługuje dużej liczby monet.
źródło
MATL , 22 bajty
Kolejność wprowadzania to: tablica nominałów, liczba pobranych monet (
n
), żądana suma (y
).Każda kombinacja jest wyświetlana w innym wierszu. Pusty wynik jest wyświetlany jako pusty ciąg (więc nic).
Wypróbuj online!
W kompilatorze internetowym zabrakło pamięci na przykład w wyzwaniu, ale działa w trybie offline ze standardowym, dość nowoczesnym komputerem:
Wyjaśnienie
źródło
Python 3,
120106 bajtówAnonimowa funkcja, która pobiera argument liczby krotek nominałów formy
(x_1, x_2, x_3 ... , x_k)
, wartości docelowej i liczby monet, i zwraca listę krotek formularza[(solution_1), (solution_2), (solution_3), ... (solution_k)]
.Jak to działa
Itertools
„scombinations_with_replacement
funkcja jest stosowana w celu wytworzenia wszystkichl-len(d)
kombinacji, zastępując nominałów. Dołączającd
do każdej z tych kombinacji, gwarantuje się, że każdy nominał pojawia się co najmniej raz, a nowa kombinacja ma długośćl
. Jeśli elementy kombinacji sumują sięt
, kombinacja jest dodawana do listy zwrotnej jako krotka.Wypróbuj na Ideone
Alternatywna metoda dla 108 bajtów
Anonimowa funkcja, która pobiera
(x_1, x_2, x_3 ... , x_k)
za pomocą argumentu krotkę nominałów formy , wartość docelową i liczbę monet i zwraca zestaw krotek formularza{(solution_1), (solution_2), (solution_3), ... (solution_k)}
.Jak to działa (inna wersja)
Ta
product
funkcja wykorzystujeitertools
do generowania wszystkichl-len(d)
układów nominałów. Dołączającd
do każdej z tych kombinacji, gwarantuje się, że każdy nominał pojawia się co najmniej raz, a nowa kombinacja ma długośćl
. Jeśli elementy kombinacji sumują sięt
, kombinacja jest sortowana, konwertowana z listy na krotkę i dodawana do krotek zwracanych. Wreszcie wywołanieset
usuwa wszelkie duplikaty.Wypróbuj na Ideone (inna wersja)
źródło
JavaScript (ES6), 135 bajtów
źródło