La tâche est simple. Donne- moi des 1000
, 500
et des 100
notes.
Comment ? vous pourriez demander. Ne vous inquiétez pas, pas besoin de voler une banque car il y a un distributeur de billets à proximité qui accepte votre carte de crédit. Mais votre limite de crédit est juste suffisante pour la tâche, vous devez donc être prudent avec les retraits.
Défi
Compte tenu du nombre de 1000
, 500
et les 100
notes nécessaires, calculer les retraits spécifiques nécessaires pour obtenir au moins les nombreuses notes. À chaque retrait, le GAB peut recracher chacune des notes selon les règles suivantes:
- Le montant retiré (
A
) est inférieur à5000
- Si
A%1000 == 0
, alors ATM crache 1500
note, 5100
notes et1000
notes de repos - Sinon, si
A%500 == 0
l'ATM crache 5100
notes, reste des1000
notes - Sinon
A%1000 < 500
, le guichet automatique crache desfloor(A/1000)
1000
notes et des100
notes de repos - Sinon
A%1000 > 500
, le guichet automatique crache desfloor(A/1000)
1000
notes, 1500
et des100
notes de repos
- Si
- Le montant retiré est supérieur ou égal à
5000
- Si
A%1000 == 0
, alors l'ATM crache 2500
notes et1000
notes de repos - Sinon, si
A%500 == 0
le GAB crache 1500
note et des1000
notes de repos - Sinon
A%1000 < 500
, le guichet automatique crache desfloor(A/1000)
1000
notes et des100
notes de repos - Sinon
A%1000 > 500
, le guichet automatique crache desfloor(A/1000)
1000
notes, 1500
et des100
notes de repos
- Si
Pour plus de précision, voici un tableau complet des notes retirées pour tous les montants possibles jusqu'à 7000
(vous pouvez retirer plus, mais le schéma ne change pas par la suite). La commande est <1000> <500> <100>
:
100 => 0 0 1 2500 => 2 0 5 4800 => 4 1 3
200 => 0 0 2 2600 => 2 1 1 4900 => 4 1 4
300 => 0 0 3 2700 => 2 1 2 5000 => 4 2 0
400 => 0 0 4 2800 => 2 1 3 5100 => 5 0 1
500 => 0 0 5 2900 => 2 1 4 5200 => 5 0 2
600 => 0 1 1 3000 => 2 1 5 5300 => 5 0 3
700 => 0 1 2 3100 => 3 0 1 5400 => 5 0 4
800 => 0 1 3 3200 => 3 0 2 5500 => 5 1 0
900 => 0 1 4 3300 => 3 0 3 5600 => 5 1 1
1000 => 0 1 5 3400 => 3 0 4 5700 => 5 1 2
1100 => 1 0 1 3500 => 3 0 5 5800 => 5 1 3
1200 => 1 0 2 3600 => 3 1 1 5900 => 5 1 4
1300 => 1 0 3 3700 => 3 1 2 6000 => 5 2 0
1400 => 1 0 4 3800 => 3 1 3 6100 => 6 0 1
1500 => 1 0 5 3900 => 3 1 4 6200 => 6 0 2
1600 => 1 1 1 4000 => 3 1 5 6300 => 6 0 3
1700 => 1 1 2 4100 => 4 0 1 6400 => 6 0 4
1800 => 1 1 3 4200 => 4 0 2 6500 => 6 1 0
1900 => 1 1 4 4300 => 4 0 3 6600 => 6 1 1
2000 => 1 1 5 4400 => 4 0 4 6700 => 6 1 2
2100 => 2 0 1 4500 => 4 0 5 6800 => 6 1 3
2200 => 2 0 2 4600 => 4 1 1 6900 => 6 1 4
2300 => 2 0 3 4700 => 4 1 2 7000 => 6 2 0
2400 => 2 0 4
Liste fournie par Martin
The Catch
Étant donné que la limite de crédit de votre carte de crédit est juste suffisante, vous devez vous assurer que le montant total retiré sur l'ensemble des retraits est le minimum possible pour la saisie / exigence donnée des notes.
Contribution
L'entrée peut être dans n'importe quel format favorable pour trois nombres correspondant au nombre de notes requises de valeur 1000
, 500
et 100
. Pas nécessairement dans cet ordre.
Sortie
La sortie est le montant à retirer dans chaque transaction, séparé par une nouvelle ligne.
Exemples
Entrée (format <1000> <500> <100>
):
3 4 1
Sortie:
600
600
600
3600
quelques autres:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Hypothèses
- Vous pouvez supposer que le GAB contient un nombre infini de billets de chaque montant.
- Vous pouvez également supposer que vous pouvez effectuer un nombre illimité de transactions.
- De plus, la solution à certaines valeurs d'entrée peut ne pas être unique, vous pouvez donc sortir n'importe quelle solution qui remplit le montant minimum possible et les conditions minimales requises pour les notes.
Comme d'habitude, vous pouvez écrire une entrée de lecture de programme complète via STDIN / ARGV et imprimer la sortie vers STDOUT ou une fonction prenant une entrée via des arguments et retourne soit une liste d'entiers correspondant aux montants, soit une chaîne avec des montants séparés par une nouvelle ligne.
C'est le code-golf donc le code le plus court en octets gagne.
la source
21 14 2
terminer dans un délai raisonnable?Réponses:
JavaScript,
184148http://jsfiddle.net/vuyv4r0p/2/
renvoie une liste d'entiers correspondant aux montants de retrait
la source
g(5,1,1)
. Une meilleure solution:5600
.g(5,1,0)
Solution:5500
.g(5,2,0)
Solution:6000
.Perl 5:
223modifier
Cette solution a été faite avec une hypothèse erronée que 7K est la limite ATM. Cela a en fait rendu la tâche plus intéressante car elle nécessitait une programmation dynamique (le modèle de déplacement était assez régulier, mais le codage en dur serait probablement plus long que le calcul en direct comme je l'ai fait). Avec n'importe quelle quantité possible, le modèle de déplacement est si régulier qu'il est trivial de le coder en dur. Je ne sais pas si la solution de @hoffmale est maintenant correcte, mais elle fera partie de ces lignes. Malheureusement, ce sera une autre tâche où quelqu'un vient d'abord avec une solution, puis elle sera transférée dans une langue de golf pour une victoire.
Un peu plus lent que la solution d'origine (mais toujours inférieur à la seconde pour les paramètres inférieurs à 100).
Solution 259 plus rapide.
Utilise STDIN:
la source
10 0 0
. Meilleure solution:10100
.