Une collection d'entiers positifs d_1 d_2 ... d_k
est une factorisation d'un entier positif n
si
d_1 * d_2 * ... * d_k = n
Chaque entier positif a une factorisation première unique , mais en général ils ont aussi des factorisations dans lesquelles certains des termes sont composites. Par exemple
12 = 6 * 2 = 4 * 3 = 3 * 2 * 2
Écrivez un programme, une fonction, un verbe ou similaire qui prend en entrée un seul entier positif et retourne ou imprime une liste complète de ses factorisations distinctes. Les factorisations peuvent être produites dans n'importe quel ordre, et leurs termes peuvent être dans n'importe quel ordre, mais il ne doit pas y avoir de permutations mutuelles. Les factorisations peuvent ne pas inclure 1
à deux exceptions près: pour l'entrée, n
vous pouvez donner la factorisation n*1
au lieu de n
; et pour l'entrée, 1
vous pouvez donner la factorisation 1
au lieu de la liste vide.
Vous pouvez supposer que l'entrée sera dans la plage d'un entier 32 bits signé. Si la sortie est une chaîne, il devrait y avoir une distinction claire entre la délimitation des nombres au sein d'une factorisation et la délimitation des factorisations, mais il n'est pas nécessaire (par exemple) que les facteurs soient joints à un *
.
Votre code doit être capable de gérer toute entrée valide dans les 10 minutes sur une machine de bureau raisonnable.
Exemples
1 [[]]
or [[1]]
or [[1 1]]
7 [[7]]
or [[7 1]]
or [[1 7]]
12 [[12] [6 2] [4 3] [2 3 2]]
or variants
16 [[2 2 2 2] [2 2 4] [2 8] [4 4] [16]]
or variants
901800900 a list of 198091 factorisations
1338557220 a list of 246218 factorisations
la source
901800900
et1338557220
quelque part où nous pouvons les vérifier? Mon code me donne 2048 et 1024 factorisations pour ces nombres, respectivement, et je ne sais pas pourquoi.Réponses:
Haskell, 56 octets
(2!)(1338557220::Int)
imprime en cinq minutes sur mon ordinateur portable, une fois compilé avecghc -O3
.Haskell, 62 octets, mais beaucoup plus rapide
(2!)(1338557220::Int)
imprime en un quart de seconde sur mon ordinateur portable, une fois compilé avecghc -O3
.la source
ghc
me donneParse error: naked expression at top level
et meghci
donneparse error on input `='
(2!)
par le programmemain = print ((2!) (1338557220::Int))
, compilez avecghc -O3 factor.hs
et exécutez avec./factor
.Pyth, 29 octets
Essayez-le en ligne
Fonctionne en vingt secondes
1338557220
sur mon ordinateur portable.la source
pyth factor.pyth
(oupyth -c 'Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2'
), fournissant16
sur stdin. Assurez-vous que vous utilisez une version actuelle de Pyth; implicite aQ
été ajouté en mars. Je ne peux pas imaginer comment vous pourriez obtenir la division par zéro, cependant."
place de'
, et bash étendait le!%
à autre chose.Python ,
2523133123111451411371351038483 83 octetsCeci est largement basé sur la réponse Pyth d'Anders Kaseorg . Toutes les suggestions de golf sont les bienvenues. Essayez-le en ligne!
Edit: 19 octets joués grâce à Dennis. Correction d'une faute de frappe dans le code et ajout d'un lien TIO.
Non golfé:
la source
**.5
se débarrasse de l'importation.JavaScript (ES6), 83 octets
J'ai seulement emprunté le truc de racine carrée de @ AndersKaseorg car il a fini par me faire gagner des octets dans l'ensemble. Imprime
1
pour une entrée de1
, sinon n'imprime pas1
s.la source
Ruby 1.9+,
878987 octetsCette réponse est basée sur la réponse Pyth d'Anders Kaseorg . Ce code ne fonctionne que pour les versions après Ruby 1.9, car les lambdas stabby
->
n'ont été introduits qu'en 1.9. Toutes les suggestions de golf sont les bienvenues.Non golfé:
la source
g[n/d,d]
:wrong number of arguments (0 for 1)
->
ont été introduites dans Ruby 1.9. Je vais modifier la réponse pour afficher le numéro de version requis.g[n/d,d]
.g(n/d,d)
est plus rétrocompatible.f[n]
faut appeler les lambdas stabby et les lambdas Ruby en général.f(n)
et lesf n
appels nécessitentdef
etend
. Plus d'infos ici et iciJ, 52 octets
Pas aussi efficace que cela pourrait l'être car certaines factorisations peuvent être répétées et une passe finale doit être effectuée après le tri de chaque factorisation puis la déduplication.
Essayez-le en ligne! (Mais essayez de garder les valeurs d'entrée faibles).
Sur mon bureau, les horaires sont
Explication
Cette méthode repose sur la génération de toutes les partitions définies pour les facteurs premiers de l'entier d'entrée n . Les performances sont meilleures lorsque n est sans carré, sinon des factorisations en double seront créées.
la source