Convertir un nombre en une somme de chiffres
Pas de somme: nous avons besoin de la somme la plus courte
Pas de chiffres: vous ne pouvez utiliser que les chiffres du nombre
Exemple
On vous donnera en entrée un entiern>0
Disons n=27
. Vous devez exprimer 27
sous forme de somme , en utilisant uniquement les chiffres [2,7]
, de la manière la plus courte possible. Vous n'êtes pas obligé d'utiliser tous les chiffres du numéro donné!
Alors 27=2+2+2+7+7+7
. Nous avons ensuite prendre ces chiffres et les compte : [2,2,2,7,7,7]
.
La réponse finale n=27
est6
Un autre exemple pour n=195
obtenir la somme la plus courte, nous devons utiliser les chiffres suivants:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]
et la réponse est23
Le défi
Étant donné un entier n>0
, affichez le nombre minimum de chiffres (contenus dans le nombre) qui résument ce nombre
Cas de test
Input->Output
1->1
2->1
10->10
58->8
874->110
1259->142
12347->1765
123456->20576
3456789->384088
C'est le code-golf . La réponse la plus courte en octets gagne!
Réponses:
Husk , 12 octets
Gère les nombres à deux chiffres assez rapidement. Essayez-le en ligne!
Explication
la source
Pyth , 12 octets
Essayez-le en ligne!
Malheureusement, il y a des erreurs de mémoire sur des entrées aussi grandes que
58
.Explication
la source
./
lef<.{TjQ;./
(filtre - sous-ensemble approprié - des chiffres de l'entrée)Mathematica, 78 octets
trouve le dernier cas de test en 5 sec
la source
Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
R , 78 octets
Essayez-le en ligne! (version golfée)
Algorithme de force brute pur, donc il ne résout pas réellement tous les cas de test, et je pense qu'il a essayé d'allouer 40 000 Go pour le dernier cas de test ...
T
dans R par défaut1
, nous obtenons donc une erreur de coup par coup que nous corrigeons à l'étape de retour, mais nous obtenons également lesF
défauts par défaut0
.explication non golfée:
Essayez-le en ligne! (version moins golfy)
la source
Python 2,
168155144 octetsCe n'est pas le plus court possible, mais c'est le meilleur avant tout et pas vraiment mauvais, en termes d'exécution.
Lefilter(None...
est de supprimer 0 comme chiffre, ce que j'ai appris que je pouvais faire en faisant cela.Le plus gros problème est les cadres de pile python, qui ne me permettent pas de l'exécuter sur les plus grandes entrées. Donc, ce n'est pas une solution valable, vraiment, j'ai joué avec l'augmentation de la limite de récursivité qui a juste conduit à des défauts de segmentation. Cela doit être fait avec une boucle et une pile ou avec beaucoup plus d'intelligence pour travailler en python.
edit: Merci à caird et Chas Brown pour 13 octets!
la source
input
et exiger que l'entrée soit entourée de guillemets.filter(None,sorted(map(int,set(n)))[::-1])
parsorted(set(map(int,n))-{0})[::-1]
(bien que laNone
chose soit assez agréable à savoir).filter(len,...)
pour les listes et les chaînes etfilter(abs,...)
pour les entiers et les flottants.Husk , 13 octets
Assez inefficace
Essayez-le en ligne!
la source
JavaScript (ES6), 82 octets
Prend l'entrée sous forme de chaîne.
la source
1/0
?f=
au début est un grand indice, puisque vous n'en avez pas besoin pour les lambdas non récursifs.Rubis , 70 octets
Très lent, essayez toutes les combinaisons possibles en augmentant la taille jusqu'à arriver à une solution.
Merci Dennis pour Ruby 2.4 sur TIO.
Essayez-le en ligne!
la source
Gelée , 23 octets
Essayez-le en ligne!
C'est tellement inefficace, qu'il ne s'exécute pas pour les cas de test après le troisième sur TIO en raison d'une limite de temps> _ <
Tous les conseils de golf sont les bienvenus!
la source
Python 2 ,
183176172 172166161 octetsEssayez-le en ligne!
Plus long que l'autre réponse Python, mais effectue tous les cas de test combinés plus
987654321
en moins d'une seconde sur TIO.Profite du fait que si
d1<d2
sont des chiffres, alors il doit y avoir au plusd2-1
d1
dans la somme (puisque lesd2
instances ded1
peuvent être remplacées par desd1
instances ded2
pour une somme plus courte). Ainsi, en triant les chiffres par ordre croissant, il n'y a "que" tout au plus9! = 362880
des sommes possibles à considérer; et une profondeur de récursivité maximale de9
(quelle que soit la valeur den
).la source
Haskell , 91 octets
Essayez-le en ligne! Exemple d'utilisation:
f 58
rendements8
. Rapide pour les nombres à deux chiffres, horriblement lent pour les entrées plus grandes.La fonction
f
convertit le numéro d'entréen
en une liste de chiffres tout en filtrant les zéros. Ensuite, cette liste etn
elle-même sont transmises à la(#)
fonction, qui retourne une liste singleton.!!0
renvoie l'élément de cette liste singleton.(#)
utilise des listes singleton et vides comme type d'option. Étant donné l'entrée den=58
ets=[5,8]
, l'idée est de soustraire tous les chiffress
den
, puis d'appliquer récursivement(#)
et de vérifier quel chiffre a entraîné le nombre minimum d'étapes et de retourner un plus ce minimum comme résultat. La première partie est calculée par(s#).(n-)=<<s
, qui est la même queconcat(map(s#)(map(n-)s))
. Ainsi, dans notre exemple, le premier[58-5,58-8]
est calculé, suivi par[[5,8]#53,[5,8]#50]
lequel résulte en[[7],[7]]
ou[7,7]
aprèsconcat
. Le résultat est mis en correspondance sur le modèlex:m
pour vous assurer que la liste contient au moins un élément (minimum
échoue sinon), puis la liste singleton de 1 plus le minimum du résultat est réaccordée. Sin
était inférieur à zéro ou l'appel récursif a renvoyé une liste vide, nous sommes dans une branche défaillante de la recherche et une liste vide est renvoyée. Sin==0
la branche a réussi et[0]
est retournée.Haskell , 101 octets
Essayez-le en ligne! Une approche beaucoup plus efficace, vérifie tous les cas de test en moins d'une seconde.
Cette fois, la liste des chiffres de l'entrée est calculée pour être décroissante, ce qui permet
(#)
d'essayer d'utiliser le plus grand chiffre aussi souvent que possible, puis le deuxième plus grand, et ainsi jusqu'à ce qu'une solution soit trouvée. La première solution trouvée de cette manière est également garantie d'être la plus petite.la source