Votre fonction prend un nombre naturel et renvoie le plus petit nombre naturel qui a exactement ce nombre de diviseurs, y compris lui-même.
Exemples:
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
La fonction n'a pas à retourner la liste des diviseurs, ils ne sont là que pour les exemples.
Réponses:
APL,
252423 caractèresDéfinit une fonction
f
qui peut ensuite être utilisée pour calculer les nombres:La solution utilise le fait que LCM (n, x) == n ssi x divise n . Ainsi, le bloc
{+/⍵=⍵∧⍳⍵}
calcule simplement le nombre de diviseurs. Cette fonction est appliquée à tous les nombres de 1 à 2 ^ d¨⍳2*⍵
. La liste résultante est ensuite recherchée pour d lui-même (⍳⍵
) qui est la fonction souhaitée f (d) .la source
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 caractèresEdit: Un seul caractère peut être enregistré si nous limitons la recherche à <2 ^ n, merci à Peter Taylor pour cette idée.
La version précédente:
Une tentative dans GolfScript, exécutée en ligne .
Exemples:
Le code contient essentiellement trois blocs qui sont expliqués en détail dans les lignes suivantes.
la source
1
.Python: 64
En révisant la solution de Bakuriu et en incorporant la suggestion de grc ainsi que l'astuce de la solution R de plannapus, nous obtenons:
la source
Python: 66
Ce qui précède soulèvera un
RuntimeError: maximum recursion depth exceeded
avec de petites entrées dans CPython, et même en fixant la limite à un nombre énorme, cela posera probablement des problèmes. Sur les implémentations python qui optimisent la récursivité de queue, cela devrait fonctionner correctement.Une version plus détaillée, qui ne devrait pas avoir de telles limitations, est la solution suivante de 79 octets:
la source
if else
parand or
et==1
par<1
:f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
enregistre 7 octets.Mathematica
3836Usage:
Résultat:
Éditer
Quelques explications:
Comme
form[i]
j'utilise la fonction1 &
, cela revient toujours1
, calculant ainsi efficacement la somme des diviseurs de manière laconique.la source
DivisorSum
revient (la somme des diviseurs) mais je ne vois pas comment cela est déterminant pour répondre à la question posée. Pourriez-vous expliquer comment cela fonctionne? BTW, je pense que vous devriez inclure des données de synchronisation pour n = 200; la fonction est remarquablement rapide, compte tenu de tous les chiffres qu'elle a dû vérifier.J, 33 caractères
Assez rapide, passe par tous les plus petits nombres et calcule le nombre de diviseurs en fonction de la factorisation.
la source
Haskell 54
Solution rapide et sale (si lisible et non délicate):
la source
K, 42
Solution récursive inefficace qui fait exploser la pile assez facilement
.
la source
APL 33
Exemple:
la source
APL (25)
la source
R - 47 caractères
!n%%1:n
donne un vecteur de booléens: VRAI quand un entier de 1 à n est un diviseur de n et FAUX sinon.sum(!n%%1:n)
contraint les booléens à 0 si FAUX et 1 si VRAI et les additionne, de sorte queN-sum(...)
c'est 0 lorsque le nombre de diviseurs est N. 0 est alors interprété comme FAUX parwhile
lequel s'arrête ensuite.Usage:
la source
Javascript 70
Il n'y a vraiment que 46 personnages significatifs:
Je devrais probablement apprendre une langue avec une syntaxe plus courte :)
la source
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Haskell: 49 caractères
Cela pourrait être considéré comme une amélioration de la solution Haskell antérieure, mais elle a été conçue à part entière (avertissement: c'est très lent):
C'est une fonction assez intéressante, notons par exemple que f (p) = 2 ^ (p-1), où p est un nombre premier.
la source
n
en nombres premiers (avec répétition), de trier par ordre décroissant, de décrémenter chacun, de compresser avec une séquence infinie de nombres premiers, puis de plier le produit dep^(factor-1)
C:
6664 caractèresUne solution presque courte:
Et ma solution précédente qui ne récuse pas:
Des solutions beaucoup plus courtes doivent exister.
la source
Haskell (120C), une méthode très efficace
Code de test:
Cette méthode est très rapide. L'idée est d'abord de trouver les facteurs premiers de
k=p1*p2*...*pm
, où p1 <= p2 <= ... <= pm. Alors la réponse estn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.Par exemple, en factorisant k = 18, nous obtenons 18 = 2 * 3 * 3. Les 3 premiers nombres premiers sont 2, 3, 5. Donc, la réponse n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
Vous pouvez le tester sous
ghci
:la source
Brachylog , 2 octets
Essayez-le en ligne!
Prend l'entrée via sa variable de sortie et sort via sa variable d'entrée.
Ce même prédicat exact, prenant l'entrée via sa variable d'entrée et la sortie via sa variable de sortie, résout ce problème à la place .
la source
C, 69 caractères
Pas la plus courte, mais la première réponse C:
f(n,s)
compte les diviseurs den
la plage1..s
. Compte donc lesf(n,n)
diviseurs den
.g(d)
boucle (par récursivité) jusqu'àf(x,x)==d
, puis retourne x.la source
Mathematica
3836Usage
Première entrée (avant l'
code-golf
ajout de la balise à la question.)Un problème simple, étant donné que
Divisors[n]
renvoie les diviseurs den
(y comprisn
) etLength[Divisors[n]]
renvoie le nombre de ces diviseurs. **Exemples
la source
Length@Divisors@n
estDivisorSigma[0,n]
.DivisorSigma
.Gelée , 6 octets (non concurrent)
Essayez-le en ligne!ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
2*
? Est-ce que chaque nombre après cela a plus de diviseurs que n?2**(n-1)
appartient à cette gamme, la plus petite aussi.C ++, 87 caractères
la source
Python2, 95 caractères, non récursif
Un peu plus verbeux que les autres solutions python mais il est non récursif donc il n'atteint pas la limite de récursivité de cpython:
la source
Perl 6 , 39 caractères
Exemple d'utilisation:
la source