Un diviseur d'un nombre n est un nombre qui divise également n , y compris 1 et n lui-même. Le nombre de diviseurs d (n) est le nombre de diviseurs d'un nombre. Voici d (n) pour le premier couple n:
n divisors d(n)
1 1 1
2 1, 2 2
3 1, 3 2
4 1, 2, 4 3
5 1, 5 2
6 1, 2, 3, 6 4
Nous pouvons soustraire à plusieurs reprises le nombre de diviseurs d'un nombre. Par exemple:
16 = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
9 - d( 9) = 9 - 3 = 6
6 - d( 6) = 6 - 4 = 2
2 - d( 2) = 2 - 2 = 0
Dans ce cas, il a fallu 5 étapes pour arriver à 0.
Écrivez un programme ou une fonction qui, étant donné un nombre non négatif n, renvoie le nombre d'étapes nécessaires pour le réduire à 0 par soustraction répétée du nombre de diviseurs.
Exemples:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Réponses:
Gelée,
109 octets1 octet merci à Dennis ♦ .
Port de ma réponse en Pyth .
Essayez-le en ligne!
Suite de tests.
Explication
la source
Python, 49 octets
orlp a aidé à sauver un octet! Et Sp3000 en a économisé deux autres. Merci!
la source
-~
enn%-~k
, et en supprimant la limite inférieure de la plage.C, 52 octets
la source
Pyth, 10 octets
Suite de tests.
Explication
la source
Julia, 31 octets
Implémentation récursive simple.
la source
MATL , 14 octets
Essayez-le en ligne!
Explication
la source
JavaScript (ES6),
6451 octetsNe me demandez pas pourquoi j'utilisais inutilement la récursivité de la queue.
la source
Java,
14793la source
n=new Integer(100000)
au lieu den=100000
?05AB1E,
1210 octetsCode:
Explication:
Essayez-le en ligne
Edit: 2 octets enregistrés et un bug avec l'entrée 0 corrigé grâce à @Adnan
la source
[Ð>#Ñg-¼]¾
. Il doit y avoir un moyen de le raccourcir cependant ...D0Q#
partie est après l'incrémentation du compteur. Le[Ð>#Ñg-¼]¾
code devrait0
cependant fonctionner :).R, 50 octets
Mise en œuvre assez simple. Essayez-le en ligne
la source
Mathcad, [tbd] octets
Le schéma d'équivalence d'octets Mathcad reste à déterminer. En utilisant une équivalence approximative, le programme utilise environ 39 "octets". Notez que les opérateurs while et for programmer ne prennent qu'une seule opération de clavier chacun pour entrer (ctl-] et ctl-shft- #, respectivement) - en effet, ils ne peuvent être entrés de cette façon qu'à partir du clavier.
Ce que vous voyez est exactement ce qui est inscrit sur une feuille de calcul Mathcad. Mathcad évalue les équations / programmes et place la sortie sur la même feuille (par exemple, après l'opérateur d'évaluation «=» ou sur le graphique).
la source
MATL, 13 octets
Essayez-le en ligne
Explication:
la source
Mathematica, 35 octets
Faire usage du bon vieux
DivisorSigma
. @ MartinBüttner note les alternatives suivantes:la source
Hoon ,
9376 octetsNon golfé:
Renvoie une fonction qui prend un atome,
r
. Créez une valeur intermédiaire qui contient tous les estimateurs der
(Make list [1..n], ne gardez que les éléments où (mod ri) == 0). Sir
est zéro retourne zéro, sinon retourne la valeur incrémentée de récursivité avec r égal r- (diviseurs de longueur).Le code tel quel prend un temps stupide à évaluer pour n = 100 000, entièrement parce que trouver les auteurs de devis pour les grands nombres fait une liste géante et les cartographie. La mémorisation des diviseurs obtient la sortie correcte pour n = 10 000, mais je n'ai pas pris la peine d'attendre 100 000
la source
Haskell,
434039 octetsApproche récursive simple. Exemple d'utilisation:
g 16
->5
.Modifier: @Lynn a enregistré
34 octets. Merci!la source
g(sum$signum.mod n<$>[1..n])
?min 1
est en fait un octet plus court quesignum
, mêmePowerShell v2 +,
7467 octetsSemble assez long par rapport à certaines des autres réponses ...
Prend une entrée
$n
, entre dans unefor
boucle avec une condition$n
supérieure à0
. Pour chaque itération de boucle, nous définissons helper$a
, puis parcourons chaque numéro de1
à$n
. Chaque boucle interne est vérifiée par rapport à chaque nombre pour voir s'il s'agit d'un diviseur, et si c'est le cas, nous incrémentons notre aide$a
(en utilisant la négation booléenne et le transtypage implicite en entier). Ensuite, nous soustrayons le nombre de diviseurs que nous avons trouvés$n-=$a
et incrémentons notre compteur$o++
. Enfin, nous sortons$o
.Prend beaucoup de temps à exécuter, car c'est une construction significative pour la boucle. Par exemple, l'exécution
n = 10,000
sur ma machine (ancien Core i5 d'un an) prend presque 3 minutes.la source
Raquette -
126 octets jusqu'à 98 octets91 octetsUne solution extrêmement naïve - pourrait probablement être réduite beaucoup avec un algorithme décent et quelques astuces lisp que je ne connais pasEdit: explication sur demande. Comme je l'ai dit, il s'agit d'une solution récursive extrêmement naïve et peut être beaucoup plus courte.
Modifier la version 2: 98 octets avec un algorithme moins stupide (toujours assez stupide et peut être plus court)Explication:Edit 3: 7 octets enregistrés en remplaçant
(cdr(build-list x values))
par(build-list x add1)
la source
> <> , 52 + 2 = 54 octets
Le numéro d'entrée doit être présent sur la pile au démarrage du programme, il y a donc +2 octets pour l'
-v
indicateur. Essayez-le en ligne!4 octets gênants gaspillés sur des problèmes d'alignement. Bah.
Celui-ci fonctionne en construisant la séquence de
n
à0
sur la pile. Une fois que 0 a été atteint, éclatez-le et sortez la longueur de la pile restante.Soit dit en passant, il fonctionne dans le
O(n^2)
temps, donc je n'essaierais pasn = 100000
...la source
-v
est un octet, pas deux.> <> , 36 + 3 = 39 octets
L'implémentation est relativement simple, chaque itération étant
sum(n%k>0 for k in range(1,n-1))
. +3 octets pour l'-v
indicateur, par méta .Essayez-le en ligne!
la source
Rubis, 42 octets
Il y a une erreur de débordement de pile sur le plus grand cas de test
100000
, voici donc une version itérative dans les 49 octets . Cela prend un certain temps, compte tenu de laO(N^2)
complexité.la source
Perl 5, 40 octets
L'entrée et la sortie sont des listes du nombre requis de copies de
1
.la source
C #, 63 octets
la source
En fait, 17 octets
Essayez-le en ligne! (remarque: le dernier cas de test arrive à expiration sur TIO)
Explication:
la source