Je dois aller à la banque et retirer de l'argent. J'ai besoin de retirer 30 dollars, 22 dollars pour payer mon coloc pour Internet et 8 dollars pour le linge. Comme aucun de ceux-ci ne peut rendre la monnaie, j'ai besoin que mes 30 dollars soient divisés en deux partitions des deux tailles. Cela signifie que lorsque le caissier me demande comment je veux mes 30 $, je vais devoir faire une demande. Je pourrais leur dire que je le veux dans vingt, cinq et cinq. Mais je veux que ma demande soit aussi simple que possible afin d'éviter de devoir me répéter. Pour simplifier ma demande, je pourrais demander que mon argent en contienne 20 et au moins 2 parce que le total 8 est implicite, mais mieux encore, je pourrais simplement demander que l’une des factures que je reçoive soit un dollar ne sont pas convaincus de cela, essayez simplement de gagner 29 dollars sans en faire 8).
Donc tout va bien, mais je dois faire ce calcul chaque fois que je vais à la banque, alors je pensais écrire un programme pour le faire (avez-vous écrit un programme pour le faire pour moi).
Votre programme ou fonction doit contenir une liste d’entiers représentant tous les paiements que je dois effectuer et un ensemble d’entiers représentant les valeurs nominales des factures disponibles à la banque. Vous devez générer la plus petite liste de valeurs nominales de sorte que le total cela inclut cette liste de dénominations peut être proprement divisée en la liste de paiements.
Règles supplémentaires
Vous pouvez supposer que la liste des dénominations contiendra toujours un
1
ou vous pourrez l’ajouter vous-même à chaque liste.Certaines entrées auront plusieurs solutions minimales. Dans ces cas, vous pouvez sortir l’un ou l’autre.
C'est du code-golf donc les réponses seront notées en octets, moins d'octets étant meilleurs
Cas de test
Payments, denominations -> requests
{22,8} {1,2,5,10,20,50} -> {1} or {2}
{2,1,2} {1,5} -> {1}
{20,10} {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2} -> {1,1,1}
{20,6} {1,4,5} -> {1}
{2,6} {1,2,7} -> {2}
{22, 11} {1, 3, 30, 50} -> {1, 3}
{44, 22} {1, 3, 30, 50} -> {1, 3, 3, 30}
{2,6} {1,2,7} -> {2}
.(If you are not convinced of this just try to make 29 dollars without making 9)
Vous voulez dire sans faire 8? Ou ai-je mal comprisRéponses:
JavaScript (ES6),
485476 octetsBon ... c'est un monstre. :-(
Mais c'est un monstre assez rapide qui résout tous les cas de test presque instantanément.
J'essaierai peut-être un peu plus de golf plus tard, mais j'ai déjà passé beaucoup trop de temps dessus.
Cas de test
Afficher l'extrait de code
Comment?
NB: Cela ne correspond plus à la version actuelle, mais est beaucoup plus facile à lire de cette façon.
la source
&&
to&
et le||
to|
?a || b
n'évaluerab
que sia
est falsy, alorsa | b
qu'il effectuera inconditionnellement un OU au niveau du bit entrea
etb
.Python 2 ,
456455 octetsExtrêmement, extrêmement, extrêmement lent !!!! Devrait fonctionner correctement sur tous les exemples d'entrée donnés suffisamment de temps
Edit: 1 octet enregistré grâce à @Jonathan Frech
Essayez-le en ligne!
Explication
la source
input()
est un octet plus courte .