...dénombré!
Vous passerez à votre programme une variable qui représente une quantité d'argent en dollars et / ou cents et un tableau de valeurs de pièces. Votre défi est de produire le nombre de combinaisons possibles du tableau donné de valeurs de pièces qui correspondraient au montant transmis au code. Si ce n'est pas possible avec les pièces nommées, le programme devrait revenir 0
.
Remarque sur la terminologie numismatique américaine:
- Pièce de 1 cent: penny
- Pièce de 5 cents: nickel
- Pièce de 10 cents: dix sous
- Pièce de 25 cents: quart (quart de dollar)
Exemple 1:
Le programme est réussi:
12, [1, 5, 10]
(12 cents)
Sortie:
4
Il existe 4 façons possibles de combiner les pièces nommées pour produire 12 cents:
- 12 centimes
- 1 nickel et 7 sous
- 2 nickels et 2 penny
- 1 centime et 2 centimes
Exemple 2:
Le programme est réussi:
26, [1, 5, 10, 25]
(26 cents)
Sortie:
13
Il y a 13 façons possibles de combiner les pièces nommées pour produire 26 cents:
- 26 centimes
- 21 centimes et 1 nickel
- 16 centimes et 2 nickels
- 11 centimes et 3 nickels
- 6 centimes et 4 nickels
- 1 penny et 5 nickels
- 16 centimes et 1 centime
- 6 centimes et 2 centimes
- 11 centimes, 1 centime et 1 nickel
- 6 centimes, 1 centime et 2 nickels
- 1 centime, 1 centime et 3 nickels
- 1 penny, 2 dimes et 1 nickel
- 1 quart et 1 penny
Exemple 3:
Le programme est réussi:
19, [2, 7, 12]
Sortie:
2
Il existe 2 façons possibles de combiner les pièces nommées pour produire 19 cents:
- 1 pièce de 12 cents et 1 pièce de 7 cents
- 1 pièce de 7 cents et 6 pièces de 2 cents
Exemple 4:
Le programme est réussi:
13, [2, 8, 25]
Sortie:
0
Il n'y a aucun moyen de combiner les pièces nommées pour produire 13 cents.
Cela a été fait via le Sandbox. Des échappatoires standard s'appliquent. C'est le golf de code, donc la réponse avec le moins d'octets gagne.
s/count/earn
.Réponses:
Gelée ( fourchette ), 2 octets
Cela repose sur une branche de Jelly où je travaillais sur la mise en œuvre des atomes de résolution de Frobenius, donc malheureusement vous ne pouvez pas l'essayer en ligne.
Usage
Explication
la source
Haskell,
3734 octetsExemple d'utilisation:
26 # [1,5,10,25]
->13
.Approche récursive simple: essayez à la fois le nombre suivant dans la liste (tant qu'il est inférieur ou égal au montant) et sautez-le. Si la soustraction du nombre conduit à un montant de zéro, prenez un
1
autre (ou si la liste manque d'éléments), prenez un0
. Additionnez ces1
s et0
s.Edit: @Damien: économisé 3 octets en pointant vers un cas de base plus court pour la récursivité (qui peut également être trouvé dans la réponse @xnors ).
la source
1209 # [1,5,10,33,48]
->1314050
.6000 # [1,5,10,33]
->22086484
.Mathematica,
3522 octetsMerci aux miles d'avoir suggéré
FrobeniusSolve
et économisé 13 octets.Évalue à une fonction sans nom, qui prend la liste de pièces comme premier argument et la valeur cible comme deuxième.
FrobeniusSolve
est un raccourci pour résoudre les équations diophantiennes de la formepour les sur les entiers non négatifs et nous donne toutes les solutions.
xi
la source
(Length@*FrobeniusSolve)[{1, 7, 9}, 18]
Pyth, 8 octets
Force brute brute, trop de mémoire pour les tests réels. C'est O (2 mn ), où n est le nombre de pièces et m est la somme cible. Prend l'entrée comme
target\n[c,o,i,n,s]
.la source
Haskell, 37 octets
L'utilisation d'un multiple de la première pièce
h
diminue la somme requises
à une valeur non négative dans la progression décroissante[s,s-h..0]
, qui doit ensuite être effectuée avec les pièces restantes. Une fois qu'il n'y a plus de pièces, vérifiez que la somme est nulle arithmétiquement comme0^s
.la source
JavaScript (ES6),
5148 octetsAccepte les pièces dans n'importe quel ordre. Essaie d'utiliser et de ne pas utiliser la première pièce, calculant récursivement le nombre de combinaisons dans les deux sens.
n==0
signifie une combinaison correspondante,n<0
signifie que les pièces dépassent la quantité tandis quec==undefined
signifie qu'il n'y a plus de pièces. Notez que la fonction est très lente et si vous avez une pièce d'un centime, la fonction suivante est plus rapide (ne passez pas la pièce d'un centime dans le tableau des pièces):la source
Perl, 45 octets
Le nombre d'octets comprend 44 octets de code et d'
-p
indicateur.Prend les valeurs des pièces sur la première ligne et le montant ciblé sur la deuxième ligne:
Explications courtes:
la source
Gelée ,
109 octetsEssayez-le en ligne!
Comment?
la source
JavaScript (ES6), 59 octets
Les pièces sont entrées du plus haut au plus bas, par exemple
f(26,[100,25,10,5,1])
. Si vous avez un sou, supprimez-le et utilisez plutôt cette version beaucoup plus rapide:Cela utilise une formule récursive semblable à celle de @ nimi. J'ai écrit ceci il y a quelques jours quand le défi était toujours dans le bac à sable; cela ressemblait à ceci:
Les seules différences étant la valeur par défaut de
c
(il y avait une valeur définie dans le défi d'origine) et la modification0
de la.reduce
fonction en1
(c'était deux octets plus court et un bazillion fois plus rapide quec=[100,25,10,5,1]
).Voici une version modifiée qui génère toutes les combinaisons, plutôt que le nombre de combinaisons:
la source
PHP, 327 octets
Essayez-le
la source
Axiome,
6362 octets1 octet enregistré par @JonathanAllan
Cette approche utilise des fonctions de génération. Cela n'a probablement pas aidé à réduire la taille du code. Je pense que c'est la première fois que dans mon jeu avec Axiom je vais jusqu'à définir ma propre fonction.
La première fois que la fonction est appelée, elle donne un avertissement horrible, mais produit toujours le résultat correct. Après cela, tout va bien tant que la liste n'est pas vide.
la source
for
?R,
817663 octetsMerci à @rturnbull d'avoir joué au golf 13 octets!
Exemple (notez que
c(...)
c'est ainsi que vous passez des vecteurs de valeurs à R):Explication:
u
est la valeur souhaitée,v
est le vecteur des valeurs des pièces.crée un bloc de données avec toutes les combinaisons possibles de 0 à k pièces (k dépend de la valeur nominale), où k est le plus bas de sorte que k fois la valeur de cette pièce soit au moins u (la valeur à atteindre).
Normalement, nous utiliserions
as.matrix
pour transformer cela en une matrice, mais cela fait beaucoup de caractères. Au lieu de cela, nous prenons la transposition de la transposition (!) Qui la contraint automatiquement, mais prend moins de caractères.%*% v
calcule ensuite la valeur monétaire de chaque ligne. La dernière étape consiste à compter combien de ces valeurs sont égales à la valeur souhaitéeu
.Notez que la complexité de calcul et les besoins en mémoire de ceci sont horribles mais bon, c'est du golf de code.
la source
expand.grid
! Et j'adore let(t())
truc. Étant donné que votre fonction n'implique qu'une seule ligne de code, vous pouvez supprimer les accolades, vous économisant 2 octets. En outre, vous pouvez basculerdo.call(expand.grid,lapply(u/v,seq,from=0))
pour justeexpand.grid(lapply(u/v,seq,f=0))
, économisant 11 octets.expand.grid
je prendrais une liste en entrée. C'est un peu dommage qui":"
ne fonctionne pas bien avec des non-entiers, sinonlapply(u/v,":",0)
cela aurait permis d'en sauver quelques autres.do.call(x,y)
est identique àx(y)
, donc il ne s'agit pas de savoir quels types d'entrée sont acceptés. Si vous voulez vraiment utiliser:
, je suppose que vous pourriez utiliserlapply(u%/%v,`:`,0)
, mais c'est le même nombre d'octets.do.call(x,y)
est le même quex(y)
" --- uniquement si cey
n'est pas une liste, ce qui est le cas dans ce cas. Mettez-vous d'accord sur votre deuxième point, cependant.J, 27 octets
Usage
Explication
la source
TSQL, 105 octets
Cela ne peut gérer jusqu'à un dollar avec ces 4 types de pièces. La version non golfée peut gérer jusqu'à environ 4 dollars, mais très lentement - sur ma boîte, cela prend 27 secondes. Le résultat est 10045 combinaisons btw
Golfé:
Non golfé:
Violon
la source
tinylisp repl , 66 octets
Solution récursive: essaie d'utiliser la première pièce et non pas la première pièce, puis ajoute les résultats de chacune. Complexité temporelle exponentielle et aucune récursivité de queue, mais elle calcule très bien les cas de test.
Non golfé (clé des commandes intégrées:
d
= définir,q
= citer,i
= si,l
= inférieur à,s
= soustraire,h
= tête,t
= queue):Exemple d'utilisation:
la source
PHP, 130 octets
Fonction récursive de 99 octets (et 31 octets de l'appeler) qui supprime à plusieurs reprises la valeur de la pièce actuelle de la cible et s'appelle avec la nouvelle valeur et les autres pièces. Compte le nombre de fois où la cible atteint 0 exactement. Courez comme:
la source
Raquette 275 octets
Non golfé:
Essai:
Sortie:
La solution récursive suivante a une erreur:
Ne fonctionne pas correctement pour:
Sortie:
(1 1 3 3) est possible mais ne figure pas dans la liste des solutions.
la source
reduce
Scheme
( groups.csail.mit.edu/mac/projects/scheme ) qui a finalement abouti à un véritable succèsRacket
( racket-lang.org , stackoverflow.com/questions/3345397/… )!Gelée , 15 octets
Essayez-le en ligne! ou Vérifiez tous les cas de test.
Il s'agissait plus d'un exercice d'écriture d'une version efficace dans Jelly sans utiliser de fonction intégrée. Ceci est basé sur l'approche de programmation dynamique typique utilisée pour calculer le nombre de façons d'apporter des changements
Explication
la source
En fait , 15 octets
Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Python, 120 octets
Bruteforces à travers toutes les combinaisons de pièces jusqu'à la valeur cible (même si la plus petite n'est pas 1).
la source