introduction
C'est un défi très simple: il suffit de compter les diviseurs d'un nombre. Nous avons eu un défi similaire mais plus compliqué auparavant, mais j'ai l'intention que celui-ci soit d'entrée de gamme.
Le défi
Créez un programme ou une fonction qui, étant donné un entier strictement positif N
, génère ou renvoie le nombre de diviseurs dont il dispose, y compris 1 et N
.
Entrée: Un entier> 0. Vous pouvez supposer que le nombre peut être représenté dans le type numérique natif de votre langue.
Sortie: le nombre de diviseurs entiers positifs qu'il possède, y compris 1 et le nombre lui-même.
Les soumissions seront notées en octets . Vous pouvez trouver ce site Web à portée de main, mais vous pouvez utiliser toute méthode raisonnable pour générer votre nombre d'octets.
C'est le code-golf , donc le score le plus bas gagne!
Edit: Il semble que la réponse Pyth de 5 octets de FryAmTheEggman soit gagnante! N'hésitez pas à soumettre de nouvelles réponses, cependant; si vous pouvez obtenir quelque chose de plus court, je changerai la réponse acceptée.
Cas de test
ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
C ++C,4357564643 octetsSur les suggestions de Martin Büttner:
la source
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 octets
Eh bien, ce n'est évidemment pas adapté pour le golf de code, mais peu importe, donc pour mon premier post et le lolz ici.
la source
.
, ce qui, j'en suis sûr, est censé être un millier de séparateurs, pas un séparateur décimal (comme cela est courant dans certaines langues).Haskell, 28 octets
L'astuce consiste ici à tester si un reste
0
utilise la fonction d'indicateur0^
.Cela fonctionne car toute puissance positive de 0 est 0, tandis que 0 ^ 0 est combinatoire le produit vide de 1.
Comparez cela au filtrage
la source
Dyalog APL ,
76 octetsIl s'agit d'une fonction sans nom qui peut être nommée puis réutilisée pour chaque
¨
cas de test ( ) comme suit:Explication:
Comptez
≢
l'∘
unique∪
du GCD∨
de lui⊢
- même et de chacun des entiers-jusqu'à⍳
.Merci à ngn d'avoir enregistré un octet.
Ancienne version:
+/0=⍳|⊢
Voilà comment cela fonctionne:
⍳|⊢
1-à-argument argument division-reste0=
booléen si 0 est égal au reste de la division+/
Somme du booléen, c'est-à-dire le nombre de uns.la source
Python 2, 37 octets
Une fonction récursive. L'entrée facultative
i
dans le diviseur en cours de test. L'expression(n%i<1)
teste la divisibilité, avecTrue
(ce qui équivaut1
) pour les diviseurs. Le résultat est ajouté à l'expression récurrente dei+1
. Lorsquei==n
est atteint, la division de plancher entière esti/n
évaluée1
et cette valeur est renvoyée comme cas de base, ce qui représenten
elle-même un diviseur den
.38:
Une fonction anonyme. Tests possibles diviseurs
1
parn
. Cela est déplacé de l' utilisation à0
travers , ce qui ajoute . La sommation des bools utilise le fait que Python traite / as / .n-1
range(n)
-~
1
True
False
1
0
la source
Rétine , 17 octets
Entrée en unaire , sortie en décimal.
Essayez-le en ligne.
Lorsqu'elle est invoquée avec une seule expression régulière, Retina compte simplement les correspondances. Le regex lui-même correspond à une position , où le nombre unaire à gauche de celui-ci est un diviseur de l'entrée entière. J'utilise également le fait que les contournements sont atomiques, de sorte que je n'ai pas besoin d'utiliser une
^
ancre.Le premier lookbehinds capture simplement le préfixe entier dans le groupe
1
. Cela ne peut jamais échouer, donc après le coup d'œil, nous savons que c'est ce qui est dans le groupe 1 et cela ne changera plus.Le lookahead vérifie ensuite si nous pouvons atteindre la fin de la chaîne en répétant la chaîne capturée (notre diviseur potentiel) 0 fois ou plus.
la source
J, 10 octets
Il s'agit d'un verbe monadique sans nom. Il calcule σ 0 (∏p k α k ) comme ∏ (α k + 1) .
Essayez en ligne avec J.js .
Comment ça marche
la source
q:
soit autorisé car cela résout une partie essentielle du défi. Que diriez-vous de juste[:+/0=]|~1+i.
q:
.Golfscript,
19181713 octetsMerci à Martin Büttner .
Comment ça marche
Également
De @Peter Taylor , également en 13 octets.
Comment ça marche
la source
~:X,{)X\%!},,
J,
131211 octetsMon premier golf à J. Je l'apprends encore.
Enregistré un octet grâce à Dennis.
Enregistré un octet de plus grâce à randomra.
Explication:
la source
Arcyóu , 12 octets
Commençons la fête!
Cela utilise la fonction intégrée
d/
. Voici une version sans le intégré (27 octets):Explication:
la source
CJam, 11 octets
Testez-le ici.
Explication
CJam n'a pas de fonction intégrée pour cela, nous faisons donc la division d'essai.
Prime
Voici une solution intéressante à 12 octets (que je soupçonne être la plus courte dans un langage comme J):
Le résultat est égal au nombre de fois
n
apparaît dans unen x n
table de multiplication:la source
Matlab, 20 octets
Effectuez
k mod n
pour chaquek = 1,...,n
, puis effectueznot
(qui transforme chaque nonzer à zéro et chaque zéro à 1) et résumez toutes ces valeurs.la source
length(divisors(n))
.@(n)
pour en faire une soumission valideJulia, 20 octets
Il s'agit d'une fonction anonyme qui fonctionne comme suit: Pour chaque entier de 1 à l'entrée, testez si le module d'entrée de l'entier est zéro. Si c'est le cas, la valeur sera
true
, sinonfalse
. Nous additionnons les booléens qui sont implicitement convertis en entiers, ce qui donne le nombre de diviseurs.Une solution beaucoup plus cool (mais aussi beaucoup plus longue), incluse par souci d'exhaustivité, est
Ceci obtient la factorisation canonique de
n
, ie\prod_{i=1}^k p_i^e_i
, et calcule la fonction de diviseur commeτ(n) = \prod_{i=1}^k e_i + 1
.la source
PARI / GP, 6 octets
PARI / GP ont un intégré pour cela.
la source
Pyth, 8 octets
Division d'essai simple.
Essayez-le en ligne ici .
la source
Rubis, 27 octets
Exemple d'exécution:
la source
Octave,
2120 octetsla source
nnz
bon usage ici =)Regex (.NET), 33 octets
En supposant que l'entrée et la sortie sont en unaire, et la sortie est tirée de la correspondance principale de l'expression régulière.
Décomposition de l'expression régulière:
.*$
ets le pointeur à la fin de la chaîne de sorte que nous ayons toute l'entrée x dans une direction.(?<=^\2*(.+?(?>\2?)))
correspond de droite à gauche et vérifie le diviseur en bouclant de x à 0.(.+?(?>\2?))
est une "variable" qui commence à 1 dans la première itération et continue à partir du nombre dans l'itération précédente et boucle jusqu'à x.^\2*
vérifie si x est un multiple de "variable".Il a essentiellement la même idée que ma réponse pour calculer Phi (pas Pi) . Seul le chèque est différent.
Testez l'expression régulière sur RegexStorm .
la source
Labyrinthe , 33 octets
Essayez-le en ligne.
Cela met en œuvre la division d'essai. J'ajouterai une explication plus tard. Ce n'est probablement pas optimal, mais j'ai du mal à trouver quelque chose de plus court.
la source
Perl 6 , 17 octets
usage:
la source
Javascript (ES6),
605742403937 octetsCela peut probablement être mieux joué au golf.
Edit 1: j'avais raison. Suppression des accolades après la boucle for.
Edit 2: Golfed à 40 octets avec merci à manatwork et Martin Büttner .
Edit 3: Sauvegarde d'un octet en basant la fonction sur la réponse C ci-dessus.
Edit 4: Merci à ן nɟuɐɯɹɐ ן oɯ et Neil , mais je n'arrive pas à faire fonctionner l'eval.
Edit 5: J'ai oublié de supprimer l'eval.
Tester
la source
var
mots clés. Plus de conseils dans Conseils pour jouer au golf en JavaScript et Conseils pour jouer au golf dans ECMAScript 6 .++i
eti++
, choisissez la première (cela n'a rien à voir avec le golf). Devrait égalementn%i<1
enregistrer un octet.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 octets
|
!
sorte que les diviseurs deviennent $ true et soient autorisés à passer; en utilisant l'alias intégré?
pourWhere-Object
()
et.Count
combien d'articles ont traversé le filtrela source
Gelée , 2 octets (sans compétition (encore))
Essayez-le en ligne!
Je pense que cela utilise des fonctionnalités implémentées après l'autre réponse Jelly. Commentez si je me trompe (je ne peux pas regarder chaque commit dans la ligne, vous savez :))
la source
Taxi, 2143 octets
Essayez-le en ligne!
Non golfé:
Explication:
la source
Japt , 3 octets
-m
est utilisé pour exécuter tous les cas de test.Essayez-le
la source
Formule Excel,
4228 octetsEdit: je viens de réaliser que je n'ai pas besoin d'utiliser
INDIRECT
, économisant 14 octets!Les éléments suivants doivent être saisis sous forme de formule matricielle ( Ctrl+ Shift+ Enter):
Où N est le nombre à tester.
Exemples:
Explication:
la source
05AB1E , 2 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Assez simple, mais le voici quand même:
la source
Mathematica, 16 octets
Composition simple des fonctions intégrées.
la source
Minkolang 0,13 , 16 octets
Vérifiez tous les cas ici.
Explication
la source