Au Canada, le sou n'est plus distribué. Les paiements en espèces sont arrondis aux 5 cents les plus proches.
L'argent peut être économisé en fractionnant les achats. Par exemple, deux articles de 1,02 $ coûtent 2,04 $, ce qui arrondit à 2,05 $, mais lors de l'achat des articles dans des achats séparés, chaque prix arrondit à 1,00 $ pour un total de 2,00 $. Cependant, lors de l'achat de deux articles à 1,03 $ chacun, il est préférable de les acheter en un seul achat.
Une autre façon d'économiser de l'argent consiste à utiliser une carte de crédit lorsque l'arrondi est défavorable, car les paiements par crédit ne sont pas arrondis. Si nous voulons deux articles 1,04 $, le prix total arrondira à 2,10 $, quelle que soit la façon dont nous répartissons les achats. Par conséquent, nous devons payer ces articles avec une carte de crédit.
Écrivez une fonction ou un programme qui accepte une liste de prix des articles sous forme d'entiers en cents et affiche le prix total le plus bas possible (en cents) pour ces articles qui peut être atteint par une séquence d'achats, chacun en espèces ou par crédit.
Le code le plus court gagne.
Cas de test
[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19
s.reduce(:+)
(normalement vous n'avez même pas besoin de paranthèses, mais dans votre cas ...) et en lignem
pour 2 caractères supplémentaires.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
de l'reduce
appel, le code se casse pour l'entrée vide. Je l'ai mentionné dans la réponse. L'intégration de m ne semble pas aider. Merci pour la dernière suggestion - c'était stupide de ma part.(c-m=c>d ?d:c)
ce qui vous donne deux caractères.-
a une priorité plus élevée que=
. Est-ce que l'affectation a une priorité élevée sur son côté gauche (comme dans, pour garantir que l'opérande gauche est une valeur l)?GolfScript (54 caractères)
Il s'agit d'un programme qui prend l'entrée de stdin en tant que valeurs séparées par des espaces. Un caractère pourrait être enregistré en forçant le format d'entrée à être à la place un tableau GolfScript.
Cas de test en ligne
L'astuce la plus intéressante est
.2$>$
pour unmin
opérateur non destructif .Mon analyse des mathématiques est essentiellement la même que celle de Jan et Ray: compte tenu des valeurs du module 5, la seule économie concerne les transactions valant 1 ou 2. L'option de carte de crédit signifie que nous ne arrondissons jamais. Donc, un article qui coûte 5n + 2 cents ne peut pas bénéficier du bundling; un article ne vaut pas non plus 5n + 1 cents (car la combinaison de deux économies de 1 cent en une économie de 2 cents ne donne aucun avantage). 0 est l'identité additive, donc les seuls cas intéressants impliquent des valeurs de 3 et 4.
3+3 = 1
et3+4 = 4+4+4 = 2
; si nous avons 3 s mixtes et 4s alors nous en préférant optimiser3+4
plus3+3
(strictement mieux) ou4+4+4
(équivalent).la source
~):m
) malheureusement sans réduction du nombre de caractères.C ++: 126 caractères
Bienvenue pour donner des conseils pour mettre ce programme devient plus court.Voici le programme de test, compilez avec le compilateur tdm-gcc 4.7.1 et exécutez-le normalement.
la source
R 143
Tests (où
P
est un alias pour le code ci-dessus)la source
Mathematica
112 126 167157 157Edit : les cas de {3, 3} et {4,4,4} sont désormais traités grâce à Peter Taylor et à cardboard_box.
Remarque: les non-achats (cas de test n ° 1) sont entrés comme
f[{0}]
.Comment ça fonctionne
Mod[n, 5]
sont ensuite traités: les 1 et les 2 deviennent des 0. Les zéros restent inchangés.Essai
a12
ajuste pour {3,3}a13
ajuste pour {4,4,4}la source
Python 3 (115 caractères)
Python 2 (106 caractères)
la source
[3,4,9]
doit donner14
, car vous pouvez combiner les articles de 3 et 4 cents pour obtenir un achat de 7 cents que vous payez en espèces avec 5 cents, et le reste de 9 cents que vous payez avec crédit, car il arrondirait autrement.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, cela donne0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, ce qui résume46.66
. Cependant, la bonne réponse est45
, donc la somme des nombres que vous imprimez n'est pas la bonne réponse et par conséquent cette solution est incorrecte.APL, 58 caractères
Le programme est essentiellement une traduction directe de la solution Ruby de Jan Dvorak .
⍬
est le vecteur vide.la source
Julia 83C
Explication:
En un seul achat, vous pouvez économiser 2 centimes au maximum.
Donc, si vous avez une combinaison qui peut vous faire économiser 2 cents, achetez-la de cette façon et ce sera optimal. Par exemple, si vous avez desx
articles avec le prix 3 (mod 5) et desy
articles avec le prix 4 (mod 5), vous pouvez créer unmin(x, y)
nombre de (3, 4) paires, ce qui vous fait économiser des2 min(x, y)
cents. Ensuite, vous utilisez les 3 autres, le cas échéant, pour vous faire économiser desmax(0, x-min(x,y)) / 2
cents. Cela peut également être calculé par(max(x,y)-y)/2
Éditer
Cette solution est fausse.
la source
4 4 4 3 3
alors4 4 4
une combinaison qui peut économiser 2 cents, mais l'acheter de cette façon n'est pas optimal. (En fait, vous ne semblez pas du tout en tenir4 4 4
compte. Ce code n'échoue-t-il pas au dernier cas de test?)