Écrivez un programme qui calcule si une valeur monétaire entrée, sous forme d'entier, peut être représentée par une combinaison unique de pièces et / ou de billets, ce qui signifie que la même pièce / billet ne peut pas être utilisé plus d'une fois.
Votre programme doit prendre une valeur en entrée et peut prendre une liste de valeurs de pièces / billets via une entrée ou via l'équivalent d'un tableau dans votre langue. La liste des pièces / billets devrait pouvoir changer, alors assurez-vous qu'il est clair où cela est défini si vous utilisez une constante.
Votre programme devrait afficher n'importe quelle valeur de vérité / fausse respectivement.
Veuillez noter que la sortie de la liste des pièces / billets qui composent la valeur n'est pas requise.
EXEMPLE
En utilisant la livre sterling, (1,00 £ = 100 et 420,69 £ = 42069)
coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
Les éléments suivants afficheront true:
6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)
Les éléments suivants afficheront false:
4
209
8889
4242424242
[ANYTHING ABOVE 8888]
DONNÉES DE TEST ALTERNATIVES (dollar américain)
coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
Bonne chance!
Réponses:
Brachylog 2 (TIO Nexus), 2 octets
Essayez-le en ligne!
Prend la liste des pièces soit via une entrée standard, soit en la ajoutant au début du programme sous la forme d'un littéral de tableau (l'une ou l'autre fonctionnera, donc c'est à vous de décider ce que vous pensez être "plus légitime"; la première est autorisée par défaut Règles PPCG, cette dernière étant expressément autorisée par la question); et prend la valeur à produire comme argument de ligne de commande.
Explication
Ce programme utilise les détails d'implémentation de la façon dont le wrapper de TIO Nexus pour les fonctions Brachylog; en particulier, il vous permet de donner un argument de ligne de commande pour fournir une entrée via la sortie. (Cela n'était pas envisagé dans la conception originale de Brachylog; cependant, les langues sont définies par leur implémentation sur PPCG, et si une implémentation arrive qui fait ce dont j'ai besoin, je peux donc en profiter.) Cela signifie que le programme ressemble à ceci:
En tant que programme complet, il renvoie une valeur booléenne;
true.
si toutes les affirmations du programme peuvent être satisfaites simultanément, oufalse.
si elles ne le peuvent pas.(Un rappel, ou pour les personnes qui ne le savent pas déjà: Brachylog 2 utilise son propre encodage de caractères dans lequel
⊇
est un seul octet de long.)la source
08
2B
(vous pouvez consulter les encodages ici ). La raison pour laquelle je n'ai pas énuméré l'encodage spécifique est qu'il n'est pas pertinent; tout ce qui compte vraiment, c'est que Brachylog n'utilise pas plus de 256 caractères uniques, afin que chacun puisse être représenté dans un seul octet. Ceci est généralement fait par les langages de golf pour rendre le code plus lisible; ils pourraient utiliser un codage comme la page de codes 437 à la place, mais si vous le faisiez, personne ne pourrait le lire .05AB1E , 4 octets
Explication:
Essayez-le en ligne!
la source
Mathematica, 25 octets
Fonction pure prenant un tableau de valeurs de pièces comme premier argument et l'entier cible comme deuxième argument, et renvoyant
True
ouFalse
.la source
Gelée, 6 octets
Essayez-le en ligne!
-2 octets grâce à Leaky Nun
-13 octets grâce à Leaky Nun (longue histoire)
la source
Rétine ,
5231 octetsEssayez-le en ligne! Prend la saisie sous forme de liste de pièces et de billets séparés par des espaces, suivie de la valeur souhaitée. Edit: 18 octets enregistrés grâce à @Kobi qui a débogué mon code. Explication: les deux premières lignes sont simplement converties de décimales en unaires. La troisième ligne capture alors la liste des pièces et billets. L'alternance permet au moteur de revenir en arrière et de choisir de ne pas capturer des pièces / billets spécifiques. Le groupe d'équilibrage compare ensuite la valeur à tous les suffixes de la liste de capture (inutile mais golfeur).
la source
^((1+) )+(\2?(?<-2>)|){99}$
(34 octets, avec une limite sur le nombre de pièces), ou^((1+) |1+ )+(\2?(?<-2>))+$
(également 34 octets).(?<-2>\2?)
fonctionne, plus un octet supplémentaire de votre deuxième réponse car le?
n'est plus nécessaire.Brachylog , 7 octets
Essayez-le en ligne!
Comment ça marche
Y compris la combinaison, 9 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) , 125 octets
Essayez-le en ligne!
la source
boolean f(int[]c,int n){for(int l=c.length;l-->0;n-=n<c[l]?0:c[l]);return n<1;}
(79 octets). Avec Java 8 et ses lambdas, il peut encore être réduit à 62 octets. En ce qui concerne votre réponse telle qu'elle est actuellement,int l=c.length-1
alors utiliserl
au lieu del-1
est également plus court.Prolog (SWI) , 46 octets
Essayez-le en ligne!
Fork de ma réponse Python .
la source
is
comme#=
, ce qui vous permettrait de supprimer des espaces).JavaScript (ES6),
81696764 octetsPrend la liste des pièces
c
et le montant ciblea
dans la syntaxe de curry(c)(a)
. Renvoie0
outrue
.Cas de test
Afficher l'extrait de code
la source
Haskell , 28 octets
La fonction d'opérateur
(#)
prend un entier et une liste d'entiers (ou, plus généralement, n'importe quelTraversable
conteneur de nombres) et renvoie aBool
.Utiliser comme
6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
.Essayez-le en ligne!
Comment ça marche
c
est la valeur souhaitée etl
la liste des valeurs des pièces.mapM(:[0])l
Les cartes de(:[0])
plusl
, l' appariement avec chaque valeur 0, puis construit le produit cartésien, ce qui donne la liste où chaque élément est soit la valeur correspondantel
, ou 0.sum<$>
additionne chaque combinaison etelem c$
vérifie si ellec
figure dans la liste résultante.la source
R,
8883 octets-5 octets grâce à @Jarko Dubbeldam
renvoie une fonction anonyme. Il génère toutes les combinaisons possibles de pièces (à utiliser
expand.grid
sur des paires deT,F
) et vérifie si la ou les valeurs sont présentes.k
is coins puisquec
est un mot réservé dans R. Peut vérifier plusieurs valeurs à la fois.Essayez-le en ligne!
la source
c(T,F)
par!0:1
, etrep(list(!0:1),length(k))
parlapply(k,function(x)!0:1)
Map(function(x)!0:1,k)
Japt , 7 octets
Essayez-le en ligne! Sorties
0
pour la fausse, un entier positif pour la vérité.Explication
la source
Python 3 , 52 octets
5 octets grâce aux ovs.
Essayez-le en ligne!
la source
Rubis , 39 octets
Renvoie
nil
la valeur falsifiée et la plus petite valeur de pièce dans la liste qui compose le nombre comme véridique (tous les nombres sont véridiques en Ruby).Attention cependant, cet algorithme est incroyablement lent, avec une
O(C!)
complexité temporelle, oùC
est la longueur de la liste des pièces. Il se termine finalement, mais la plupart des cas de test expireront même sur la plupart des interprètes en lignef(UK_POUND, 5)
.Voici une version de 41 octets qui se termine beaucoup plus rapidement en ajoutant une condition de fin supplémentaire et est beaucoup plus difficile à expirer
Essayez-le en ligne!
la source
Utilitaires Bash + GNU,
5639La liste des dénominations d'entrée (non triées) est donnée sous forme de liste séparée par des virgules. La liste et la valeur d'entrée sont données sous forme de paramètres de ligne de commande.
Sortie donnée sous forme de code retour shell. Inspectez
echo $?
après avoir exécuté le script.0
signifie véridique,1
signifie fausseté.Essayez-le en ligne .
printf %$2s
génère une chaîne d'value
espaces"^ {${1//,/\}? {}}?$"
est une extension de shell qui étend la liste des dénominations à une expression rationnelle comme^ {1}? {2}? {5}? {10}? ... $
. Il s'avère que leegrep
moteur d'expression régulière est suffisamment intelligent pour correspondre correctement à cela, quel que soit l'ordre dans lequel les dénominations sontegrep
vérifie si la chaîne d'espaces correspond à l'expression régulièrela source
C, 66 octets
Voyez-le fonctionner ici .
C, 53 octets
Cette variante prend le tableau de pièces, ce qui va à l'encontre de l'objectif de ce problème, car il s'agit d'une simple soustraction.
Le premier argument est le tableau de pièces, le second est le nombre de pièces et le troisième est la valeur.
C, 48 octets
Une alternative à la variante précédente. Il suppose que le réseau de pièces peut être inversé et terminé par zéro.
la source
Pyth , 6 octets
Suite de tests.
la source
CJam ,
1817 octetsEssayez-le en ligne!
Explication
la source
C (gcc) , 91 octets
Essayez-le en ligne!
la source
PHP, 70 octets
imprime 1 pour vrai et rien pour faux
Essayez-le en ligne!
la source
Octave, 39 octets
Une fonction anonyme qui prend un tableau de valeurs de pièces comme premier argument et l'entier cible comme deuxième argument, et renvoie vrai ou faux.
Essayez-le en ligne!
la source
Mathematica, 42 octets
contribution
la source