Pépites de code
C'est une situation hypothétique où c'est vendredi soir, et vous avez invité les copains de golf habituels à participer à votre passe-temps préféré: le golf à code. Cependant, comme il s'agit d'une tâche épuisant pour le cerveau, vous devez ramasser de la nourriture pour le cerveau du groupe afin de pouvoir jouer au golf autant que possible en dehors de votre code.
Maintenant, la collation préférée de tout le monde est les pépites de poulet, mais il y a un problème: il n'y a pas de paquet unique qui couvre les besoins de chacun. Donc, comme vous êtes déjà d'humeur golfique, vous décidez de créer un programme qui détermine exactement quels packs vous devez acheter pour pouvoir couvrir les besoins de chacun.
Les tailles de pépites de poulet sont partout, et selon l'endroit où vous vivez dans le monde, les tailles standard changent également. Cependant, [l'endroit qui sert les pépites] le plus proche stocke les tailles suivantes de packs de pépites :
4, 6, 9, 10, 20, 40
Vous pouvez maintenant remarquer que vous ne pouvez pas commander certaines combinaisons de pépites. Par exemple, les 11
pépites ne sont pas possibles, car il n'y a pas de combinaison 11
exactement égale . Cependant, vous pouvez faire 43
en obtenant 1 pack de 20
, 1 pack de 10
, 1 pack de 9
et 1 pack de 4
,
20 + 10 + 9 + 4 = 43 (597)
où 597
chaque terme est quadrillé et additionné (indice: la solution optimale a cette valeur la plus élevée) . Il existe bien sûr d'autres façons de fabriquer 43
, mais comme vous le savez, plus il y a de pépites par paquet, moins c'est cher par pépite. Ainsi, vous souhaitez idéalement acheter le moins de packs et en plus grandes quantités pour minimiser vos coûts.
La tâche
Vous devez créer un programme ou une fonction qui prend une liste d'entiers correspondant aux exigences de chaque personne. Vous devez ensuite calculer et imprimer la commande α la plus rentable pour acheter les pépites de poulet. L' ordre α le plus rentable est la combinaison par laquelle la somme des carrés de chaque quantité est la plus élevée. S'il n'y a absolument aucun moyen d'acheter les pépites parfaitement, vous devez imprimer une valeur falsy telle que 0
, False
, Impossible!
ou tout ce qui est disponible dans votre langue.
Exemple d'E / S:
[2 7 12 4 15 3] => [20 10 9 4]
1, 1, 2, 1 => False
6 5 5 5 5 5 9 => 40
[6, 4, 9] => 9 10
1 => 0
199 => 40, 40, 40, 40, 20, 10, 9
2 => Impossible!
Voici la liste des solutions idéales pour les 400 premiers. Notez que celles-ci ne sont pas formatées comme je m'y attendrais, chacune tuple
est sous la forme (N lots of M)
.
Règles
- Pas de failles standard.
- Aucune utilisation des fonctions intégrées qui effectuent la totalité ou la majorité de la tâche, comme
FrobeniusSolve
dans Mathematica.
α - Pour clarifier cela avec un exemple, vous pouvez également faire 43 en faisant 4 + 6 + 6 + 9 + 9 + 9 = 43 (319)
, mais ce ne serait pas optimal, et donc une sortie incorrecte, car la somme des carrés est inférieure à la combinaison que j'ai notée dans l'introduction. Essentiellement, somme de carrés plus élevée = coût inférieur = plus rentable.
Réponses:
Pyth,
2625 octetsNotez qu'il existe des caractères non imprimables. Essayez-le en ligne: démonstration . C'est assez lent (mais pas aussi lent que ma solution de 26 octets).
Explication:
Pyth, 32 octets
Notez qu'il existe des caractères non imprimables. Essayez-le en ligne: Démonstration Cette version est beaucoup plus rapide. Il trouve la solution pour l'entrée
[6,7,8]
en environ une seconde et la solution pour l'entrée[30]
en environ 90 secondes.Explication:
la source
.a
méthode est plus courte que la quadrature et la sommations^R2
.Perl,
175153Prend son entrée à partir des arguments du programme. Imprime un :( s'il ne trouve pas de solution parfaite.
Code non golfé:
PS: C'est probablement la première entrée qui ne prend pas 10 minutes
1 2
;)Vérifiez le ici.
la source
18
doit s'imprimer9 9
, non4 4 10
.9
et10
.CJam,
452928 octetsNotez que cette approche est très lente et gourmande en mémoire.
Essayez-le en ligne dans l' interpréteur CJam .
Il peut être accéléré de manière significative au prix de 5 octets:
La complexité est toujours exponentielle dans la somme des entrées, mais cela devrait gérer des cas de test jusqu'à 159 avec l'interpréteur en ligne et jusqu'à 199 avec l'interpréteur Java en quelques secondes.
Essayez-le en ligne dans l' interpréteur CJam .
Idée
Un achat optimal (somme maximale des carrés) est un achat valide (nombre correct de pépites) qui a autant de 40 que possible, puis autant de 20 que possible, puis autant de 9 que possible (par exemple,
9 9
est préférable à10 4 4
) et ainsi de suite pour 10 , 6 et 4 .Dans cette approche, nous générons le produit cartésien de N copies du tableau [40 20 9 10 6 4 0] , où N est le nombre souhaité de pépites. N est une (mauvaise) limite supérieure pour le nombre d'achats que nous devons effectuer. Dans la version accélérée du code, nous utilisons à la place N / 40 + 4 .
En raison de la façon dont le tableau est ordonné, le produit cartésien commencera par le vecteur [40 ... 40] et se terminera par le vecteur [0 ... 0] . Nous calculons l'index du premier vecteur qui a la somme correcte (qui aura également la somme optimale des carrés), récupérons l'élément de tableau correspondant, supprimons les zéros qui ont servi d'espaces réservés et imprimons le résultat.
Si aucun vecteur n'a pu être trouvé, l'indice sera -1 , nous récupérons donc [0 ... 0] , qui affichera un tableau vide à la place.
Code
la source
Julia, 126 octets
Cela crée une fonction sans nom qui accepte un tableau en entrée et imprime un tableau ou un booléen sur STDOUT, selon qu'il existe une solution. Pour l'appeler, donnez-lui un nom, par exemple
f=n->...
.Non golfé + explication:
Exemples:
la source
Python 3 - 265 caractères
Affichage de l'espacement:
Réussit tous les cas de test
Remarque: Je ne sais pas si cela passera tous les cas car c'est si lent ... Mais ça devrait ...
la source
from blah import*
c'est toujours mieux. La seule exception à laquelle je peux penser pour ce qui précède est que si vous avez plusieursimport
s, c'est le seul moment qui me vient à l'esprit oùas
est réellement utile.JavaScript,
261256261Je ne sais pas si cela va bien, cela semble fonctionner mais je manque sûrement des choses.
Il ne semble pas être lent cependant, jusqu'à
123456
ce qu'il produise[40 x 3086, 10, 6]
presque immédiatement.Explication:
Itération sur la taille des pépites (la plus grande en premier)
Pour 199 | 1 La pile construite ressemble à ceci
Pour 1
la source
11
imprime[6]
et18
imprime[10, 4]
.[10,4]
parce qu'il me manquait une paire de parens. La vérification était en effet erronée, je viens de vérifier s'il y avait au moins un élément dans l'ensemble de résultats, pas s'il résume correctement. Je ne sais pas ce que j'y pensais