Jouez-moi un peu d'argent au GAB

26

La tâche est simple. Donne- moi des 1000, 500et des 100notes.

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, 500et les 100notes 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 1 500note, 5 100notes et 1000notes de repos
    • Sinon, si A%500 == 0l'ATM crache 5 100notes, reste des 1000notes
    • Sinon A%1000 < 500, le guichet automatique crache des floor(A/1000) 1000notes et des 100notes de repos
    • Sinon A%1000 > 500, le guichet automatique crache des floor(A/1000) 1000notes, 1 500et des 100notes de repos
  • Le montant retiré est supérieur ou égal à 5000
    • Si A%1000 == 0, alors l'ATM crache 2 500notes et 1000notes de repos
    • Sinon, si A%500 == 0le GAB crache 1 500note et des 1000notes de repos
    • Sinon A%1000 < 500, le guichet automatique crache des floor(A/1000) 1000notes et des 100notes de repos
    • Sinon A%1000 > 500, le guichet automatique crache des floor(A/1000) 1000notes, 1 500et des 100notes de repos

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, 500et 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.

Optimiseur
la source
@nutki en effet. Édité.
Optimizer
Y a-t-il des restrictions de vitesse? Le dernier cas de test doit-il se 21 14 2terminer dans un délai raisonnable?
Jakube
1
@Jakube Dans un délai raisonnable - oui (disons moins de 5-6 heures). Mais en tant que tel, aucune limite, car il s'agit de code-golf.
Optimizer
Donc, si je retire 0, cela me donnera cinq 100 notes?
AJMansfield
@AJMansfield bien sûr que non. Vous ne pouvez pas retirer 0 montant
Optimizer

Réponses:

7

JavaScript, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

renvoie une liste d'entiers correspondant aux montants de retrait

hoffmale
la source
Essayez g(5,1,1). Une meilleure solution: 5600.
jimmy23013
devrait être corrigé maintenant
hoffmale
g(5,1,0)Solution: 5500.
jimmy23013
cela devrait maintenant aussi être corrigé ^^ merci de l'avoir signalé, je dois être trop endormi
hoffmale
g(5,2,0)Solution: 6000.
jimmy23013
1

Perl 5: 223

modifier

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).

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

Solution 259 plus rapide.

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

Utilise STDIN:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600
nutki
la source
Essayez 10 0 0. Meilleure solution: 10100.
jimmy23013
@ user23013 oups, j'ai mal compris la question. J'ai supposé que 7k est le montant maximum :( J'espère que je serai en mesure de le réparer.
nutki