Le problème de changement de pièces est très bien documenté. Compte tenu d' une offre infinie de pièces de dénominations x_1
pour x_m
vous devez trouver le nombre de combinaisons qui ajoutent jusqu'à y
. Par exemple, étant donné x = {1,2,3}
et y = 4
nous avons quatre combinaisons:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
introduction
Il existe plusieurs variantes du problème de changement de pièce. Dans cette variante, nous avons deux restrictions supplémentaires:
- Chaque dénomination doit être utilisée au moins une fois.
- Exactement, un nombre fixe de pièces doit être utilisé au total.
Par exemple, étant donné x = {1,2,3}
, y = 36
et n = 15
où n
est le nombre total de pièces qui doivent être utilisées, nous obtenons quatre combinaisons:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1 un, 7 deux, 7 trois){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2 un, 5 deux, 8 trois){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3 un, 3 deux, 9 trois){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4 unités, 1 paire, 10 trois)
Défi
Le défi est d'écrire une fonction enumerate
dans la langue de votre choix qui énumère toutes les combinaisons décrites ci-dessus étant donné:
- La liste des dénominations. Par exemple
{1,5,10,25}
. Vous pouvez utiliser des listes ou des tableaux. - Un entier non négatif
y
qui représente la somme de chaque combinaison. - Un entier non négatif
n
qui indique le nombre total de pièces.
L'ordre des arguments n'a pas d'importance. Les fonctions sans point sont autorisées.
La sortie de la enumerate
fonction doit être une liste de combinaisons. Chaque combinaison doit être unique et ce doit être une liste d' n
entiers qui s'additionnent y
. Chaque dénomination doit apparaître au moins une fois dans chaque combinaison et aucune combinaison ne doit manquer. L'ordre des entiers et des combinaisons n'a pas d'importance. Vous pouvez utiliser des listes ou des tableaux pour la sortie.
Gardez à l'esprit les cas de bord suivants:
- Si les deux
y
etn
sont nuls et que la liste des dénominations est vide, la sortie est une liste d'une combinaison, la combinaison vide (c'est-à-dire{{}}
). - Sinon, si
y
est zéro,n
est nul ou la liste des dénominations est vide alors la sortie est une liste de combinaisons nulles (ie{}
). - Plus généralement, si
y
est inférieur à la somme des dénominations oun
est inférieur au nombre de dénominations, alors la sortie est une liste de combinaisons nulles.
La notation sera basée sur la taille de l'ensemble du programme en octets. Notez que cela inclut la enumerate
fonction, les fonctions d'assistance, les instructions d'importation, etc. Cela n'inclut pas les cas de test.
la source
y
est inférieur à la somme des dénominations, à un moment donné de votre solution récursive, vous atteindrez le cas de base où la liste des dénominations est vide. Par conséquent, la réponse sera{}
(c.-à-d. Aucune solution trouvée). Sin
est inférieur au nombre de dénominations, vous finirez par atteindre le cas de base oùn = 0
maisy != 0
. Par conséquent, la réponse sera à nouveau{}
.Réponses:
05AB1E, 20 octets
L' entrée est dans l'ordre:
list of values
,nr of coins
,sum to reach
.Explication en bref
final length - length of unique coin list
Essayez-le en ligne
Le compilateur en ligne ne peut pas gérer un grand nombre de pièces.
la source
MATL , 22 octets
L'ordre d'entrée est le suivant: tableau de coupures, nombre de pièces prises (
n
), somme souhaitée (y
).Chaque combinaison est affichée sur une ligne différente. La sortie vide est affichée sous forme de chaîne vide (donc rien).
Essayez-le en ligne!
Le code manque de mémoire dans le compilateur en ligne pour l'exemple du défi, mais fonctionne hors ligne avec un ordinateur standard assez moderne:
Explication
la source
Python 3,
120106 octetsUne fonction anonyme qui prend en entrée un tuple de dénominations du formulaire
(x_1, x_2, x_3 ... , x_k)
, une valeur cible et un certain nombre de pièces via un argument, et renvoie une liste de tuples du formulaire[(solution_1), (solution_2), (solution_3), ... (solution_k)]
.Comment ça fonctionne
Itertools
Lacombinations_with_replacement
fonction est utilisée pour générer toutes lesl-len(d)
combinaisons, avec remplacement, des dénominations. En ajoutantd
à chacune de ces combinaisons, il est garanti que chaque dénomination apparaît au moins une fois et que la nouvelle combinaison a une longueurl
. Si les éléments d'une combinaisont
s'additionnent à, la combinaison est ajoutée à la liste de retour en tant que tuple.Essayez-le sur Ideone
Une méthode alternative pour 108 octets
Une fonction anonyme qui prend en entrée un tuple de dénominations du formulaire
(x_1, x_2, x_3 ... , x_k)
, une valeur cible et un certain nombre de pièces via un argument, et renvoie un ensemble de tuples du formulaire{(solution_1), (solution_2), (solution_3), ... (solution_k)}
.Comment ça marche (autre version)
Ceci utilise la
product
fonction fromitertools
pour générer tous lesl-len(d)
arrangements des dénominations. En ajoutantd
à chacune de ces combinaisons, il est garanti que chaque dénomination apparaît au moins une fois et que la nouvelle combinaison a une longueurl
. Si les éléments d'une combinaison totalisentt
, la combinaison est triée, convertie d'une liste en tuple et ajoutée aux tuples de retour. Enfin, l'appelset
supprime tous les doublons.Essayez-le sur Ideone (autre version)
la source
JavaScript (ES6), 135 octets
la source