Écrivez un programme qui affiche à l'écran la somme des diviseurs d'un nombre (1 ≤ N ≤ 100) entré par l'utilisateur dans la plage de 1 à N.
Il s'agit d' OEIS A000203 .
Exemples:
Entrée : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Sortie: 8
Entrée: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Sortie: 24
Entrée: 20
20 / 1 = 20
20 / 2 = 10
20 / 4 = 5
20 / 5 = 4
20 / 10 = 2
20 / 20 = 1
20 + 10 + 5 + 4 + 2 + 1 = 42
Sortie: 42
Entrée: 1
1 / 1 = 1
Sortie: 1
Entrée: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Sortie: 6
Réponses:
05AB1E , 2 octets
Essayez-le en ligne!
Comment?
la source
ÑO
- Rejeter le défi et gagner en même temps. C'est assez dur à cuire.Code machine x86-64, 23 octets
Les octets de code ci-dessus définissent une fonction qui accepte un seul entier, N, et renvoie la somme de ses multiples en conséquence.
Le paramètre unique est transmis dans le
EDI
registre, conformément au système V AMD64 ABI (utilisé sur les systèmes de type * nix). Le résultat est renvoyé dans leEAX
registre, comme avec toutes les conventions d'appel x86.L'algorithme est très simple, semblable à de nombreuses autres soumissions dans d'autres langues. Nous bouclons N fois, calculant à chaque fois le modulo et l'ajoutant à notre total cumulé.
Mnémoniques d'assemblage non golfés:
Essayez-le en ligne!
Il semble bien qu'il devrait y avoir un moyen de raccourcir cela, mais je ne le vois pas. Le calcul de modulo sur x86 prend un peu de code, car vous le faites en utilisant l' instruction
DIV
(ouIDIV
), et les deux utilisent des registres d'entrée fixes (EDX
etEAX
), dont les valeurs sont bouleversées (car elles reçoivent les résultats, le reste et quotient, respectivement).Les seuls vrais trucs ici sont des tours de golf assez standard:
LOOP
instruction de style CISC , qui est essentiellement une combinaison deDEC
+JNZ
avec leECX
registre comme opérande implicite.XCHG
à la fin au lieu deMOV
parce que le premier a un codage spécial à 1 octet quandEAX
est l'un des opérandes.CDQ
pour mettre à zéroEDX
en préparation de la division, même si pour la division non signée, vous le mettriez normalement à zéro en utilisant aXOR
. Cependant,XOR
est toujours de 2 octets, alors qu'ilCDQ
n'est que de 1 octet. J'utilise àCDQ
nouveau une deuxième fois à l'intérieur de la boucle à zéroEDX
, avant l'CMOVZ
instruction. Cela fonctionne parce que je peux être assuré que le quotient de la division (inEAX
) est toujours non signé, donc une extension de signe dansEDX
sera définieEDX
sur 0.la source
C (gcc), 45 octets
Essayez-le en ligne!
la source
Japt , 3 octets
Essayez-le en ligne!
la source
â x
-x
, cela pourrait être un octetBrachylog , 2 octets
Essayez-le en ligne!
Explication
la source
Mathematica, 14 octets
ou une réponse de @Loki
Mathematica, 17 octets
la source
Tr@Divisors@#&
encore mieux ;-)f=
qui prend une entrée f [x] c'est pourquoi je le présente de cette façon. Bienvenue sur PPCGTr@*Divisors
pour raser un octet.C, C ++, C #, D, Java,
6562 octetsCela fonctionne dans toutes ces 5 langages de programmation en raison de similitudes.
Optimisation C, C ++ et D:
6260 octetsEn C ++ et D, les entiers se convertissent implicitement en booléens (Zero => false, Not Zero => true), vous n'avez donc pas besoin d'avoir le
!=0
Optimisation D: système de modèles golfy, 55 octets
Code à tester :
C:
C ++:
C #:
RÉ :
Java:
la source
n%i
/n%i!=0
dans aucune des langues. Deuxièmement, votre première solution devrait pouvoir avoirn%i>0
au lieu den%i!=0
. Troisièmement, la solution de D peut êtreT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
en abusant du système de modèles et des valeurs par défaut.Shnap ,
4443 octets-1 bye merci à M. Xcoder (lol j'étais outgolfé dans ma propre langue)
Ceci est une fonction (
$
démarre une fonction dans Shnap).Essayez-le en ligne!
Explication:
Sans concurrence, 19 octets
Après de nombreuses mises à jour linguistiques, cela peut maintenant être réduit à un maigre 19 octets:
Essayez-le en ligne!
la source
==0
est<1
( 43 octets )Python, 44 octets
la source
J, 23 octets
Essayez-le en ligne!
Pour les fans de J, il existe une solution astucieuse de 13 octets :
>:@#.~/.~&.q:
mais comme ce n'est pas mon invention, je ne la poste pas comme ma réponse officielle.Ma propre solution filtre simplement 1..n, trouvant des diviseurs, puis les additionne. Le nœud est la fourche dyadique
Notez que dans ce contexte
]
est 1..n, et[
est n lui-même. D'où]|[
les restes lors de la division de chaque élément de 1..n en n, et=&0
vous indique s'ils sont égaux à 0.la source
+1#.i.*0=i.|]
i.|]
une grande amélioration de mon approche. Je ne comprends pas bien cette partie:+1#.i.
- pourriez-vous l'expliquer?1#.
est la conversion en base 1, ce qui équivaut à+/"1
. D'abordi.|]
pour obtenir les restes, puis0=
pour trouver ceux égaux à 0 (les diviseurs), puisi.*
pour mettre à zéro les non-diviseurs dans la plage, puis additionner en utilisant1#.
, puis s'ajouter+
puisqu'ili.
s'agit d'une plage exclusive.Java (OpenJDK 8) ,
5351 octetsEssayez-le en ligne!
la source
Haskell , 30 octets
Essayez-le en ligne!
la source
MATL , 6 octets
Essayez-le en ligne!
-4 octets grâce à @LuisMendo
10 octets
Ma solution précédente en utilisant une boucle
Essayez-le en ligne!
3 octets
Utilisation de la fonction intégrée
Essayez-le en ligne!
la source
Javascript,
5444 octets10 octets enregistrés grâce à Shaggy
Essayez-le en ligne!
la source
Brain-Flak , 96 octets
Essayez-le en ligne!
Explication:
Désormais obsolète par des améliorations.
Le cœur de l'algorithme est le suivant:
C'est une modification sur le mod qui nous donnera
M
si c'est un facteur deN
et0
autrement. Le code complet est ci-dessous.la source
R ,
3126 octetsEssayez-le en ligne!
Renvoie une
1x1
matrice.Calcule les
!N%%x
éléments cartographiquesd
de1:N
par:d->(1 if d divides N, 0 otherwise)
Alors,
x%*%x!N%%x
le produit matriciel1:N
donne la somme dex
où!N%%x
est1
. Soigné! Techniquement un port de la réponse Octave de Luis Mendo mais je ne l'ai vu qu'après y avoir pensé.Numéros R +, 14 octets
Essayez-le en ligne!
la source
N=scan();
numbers::Sigma(N)
? Comme cela, il génère le code source de la fonctionSigma
.JavaScript, 31 octets
la source
Pari / GP , 5 octets
Essayez-le en ligne!
la source
Python 2 , 41 octets
Essayez-le en ligne!
la source
VBA (Excel), 73 octets
la source
Sub Y
...End Sub
pour obtenir la solution de 85 octetsSub y
A=Cells(1,1)
x=1
While x<=A
If A Mod x=0 Then b=b+x
x=x+1
Wend
MsgBox b
End Sub
Sub y
While x<=[A1]
x=x+1
If [A1]Mod x=0Then b=b+x
Wend
Debug.?b
End Sub
qui suppose qu'il est exécuté dans un module propre (x = valeur int par défaut0
) et sort dans la fenêtre immédiate VBE (?
mise en forme automatiquePrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
qui suppose quex
,b
est la valeur par défaut de 0 et sort dans la fenêtre immédiate VBE (à partir de la fenêtre immédiate VBE?
équivaut àDebug.Print
)Pyth , 6 octets
Essayez-le ici!
Pyth n'a pas de diviseurs intégrés, donc je pense que c'est raisonnable.
Explication
Étant donné
20
, par exemple, voici ce que fait notre programme après chaque instruction:P
:[2, 2, 5]
.y
:[[], [2], [2], [5], [2, 2], [2, 5], [2, 5], [2, 2, 5]]
.{
:[[], [2], [5], [2, 2], [2, 5], [2, 2, 5]]
.*M
:[1, 2, 5, 4, 10, 20]
.s
:42
.la source
Ohm v2 , 2 octets
Essayez-le en ligne!
C'est assez simple:
la source
Husk , 5 octets
Essayez-le en ligne!
Comment?
Thanks to Zgarb for the suggestions in chat!
la source
Octave, 20 bytes
Try it online!
la source
RProgN 2, 2 bytes
Explained
Trivial, but felt it needed to be posted.
Try it online!
la source
Perl 5, 35 + 1 (-p) = 36 bytes
Try it online!
la source
Bash + GNU utilities, 36
Try it online.
Pure Bash, 41
Try it online.
I first tried a fancy bash expansion answer, but it ended up being longer than the simple loop above:
la source
Add++, 9 bytes
Try it online!
I clearly got here too late. This defines a function that gets the factors, then sums them.
la source
QBIC, 17 bytes
Explanation
la source
Gaia, 2 bytes
Try it online!
Pretty straight-forward:
la source