Escriba un programa que muestre en la pantalla la suma de los divisores de un número (1 ≤ N ≤ 100) ingresado por el usuario en el rango de 1 a N.
Este es OEIS A000203 .
Ejemplos:
Entrada : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Salida: 8
Entrada: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Salida: 24
Entrada: 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
Salida: 42
Entrada: 1
1 / 1 = 1
Salida: 1
Entrada: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Salida: 6

Respuestas:
05AB1E , 2 bytes
Pruébalo en línea!
¿Cómo?
fuente
ÑO- Rechazar el desafío y ganar al mismo tiempo. Eso es bastante rudo.Código de máquina x86-64, 23 bytes
Los bytes de código anteriores definen una función que acepta un solo entero, N, y como resultado devuelve la suma de sus múltiplos.
El parámetro único se pasa en el
EDIregistro, de acuerdo con el System V AMD64 ABI (como se usa en los sistemas de estilo * nix). El resultado se devuelve en elEAXregistro, como con todas las convenciones de llamadas x86.El algoritmo es muy sencillo, similar a muchos de los otros envíos en otros idiomas. Realizamos un bucle N veces, cada vez que calculamos el módulo y lo agregamos a nuestro total acumulado.
Mnemónicos de ensamblaje sin golf:
Pruébalo en línea!
Parece que debería haber una forma de acortar esto, pero no puedo verlo. El módulo de cómputo en x86 requiere bastante código, ya que lo hace usando la instrucción
DIV(oIDIV), y ambos usan registros de entrada fijos (EDXyEAX), cuyos valores se bloquean (porque reciben los resultados, el resto y cociente, respectivamente).Los únicos trucos reales aquí son los de golf bastante estándar:
LOOPinstrucción de estilo CISC , que es básicamente una combinación deDEC+JNZcon elECXregistro como el operando implícito.XCHGal final en lugar deMOVporque el primero tiene una codificación especial de 1 byte cuandoEAXes uno de los operandos.CDQponer a ceroEDXen la preparación para la división, aunque para la división sin signo, normalmente lo pondría a cero usando aXOR. Sin embargo,XORsiempre tiene 2 bytes, mientrasCDQque solo tiene 1 byte. UtilizoCDQnuevamente una segunda vez dentro del ciclo a ceroEDX, antes de laCMOVZinstrucción. Esto funciona porque puedo garantizar que el cociente de la división (inEAX) siempre está sin signo, por lo que una extensión de inicio de sesiónEDXse estableceráEDXigual a 0.fuente
C (gcc), 45 bytes
Pruébalo en línea!
fuente
Japt , 3 bytes
Pruébalo en línea!
fuente
â x-x, podría ser un byteBrachylog , 2 bytes
Pruébalo en línea!
Explicación
fuente
Mathematica, 14 bytes
o una respuesta de @Loki
Mathematica, 17 bytes
fuente
Tr@Divisors@#&incluso mejor ;-)f=que tome una entrada f [x] por eso lo presento de esta manera. Bienvenido a PPCGTr@*Divisorspara afeitarte un byte.C, C ++, C #, D, Java,
6562 bytesEsto funciona en todas las tesis 5 lenguajes de programación debido a similitudes.
Optimización C, C ++ y D:
6260 bytesEn C ++ y D, los enteros se convierten implícitamente en booleanos (cero => falso, no cero => verdadero), por lo que no necesita tener el
!=0Optimización D: sistema de plantillas de golf, 55 bytes
Código para probar :
C :
C ++:
C# :
D:
Java:
fuente
n%i/n%i!=0en ninguno de los idiomas. En segundo lugar, su primera solución debería poder tenerla enn%i>0lugar den%i!=0. Tercero, la solución de D puede serT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}abusando del sistema de plantillas y los valores predeterminados.Shnap ,
4443 bytes-1 adiós gracias al Sr. Xcoder (jaja, me superaron en mi propio idioma)
Esta es una función (
$inicia una función en Shnap).Pruébalo en línea!
Explicación:
Sin competencia, 19 bytes
Después de muchas actualizaciones de idioma, ahora se puede reducir a unos miserables 19 bytes:
Pruébalo en línea!
fuente
==0es<1( 43 bytes )Python, 44 bytes
fuente
J, 23 bytes
Pruébalo en línea!
Para los fanáticos de J, hay una solución inteligente de 13 bytes :
>:@#.~/.~&.q:pero como no fue mi invención, no la publico como mi respuesta oficial.Mi propia solución simplemente filtra 1..n, encuentra divisores, luego los suma. El quid de la cuestión es el tenedor diádico.
Tenga en cuenta que en este contexto
]es 1..n, y[es n en sí mismo. Por]|[lo tanto, son los restos al dividir cada elemento de 1..n en n, y=&0le dice si son iguales a 0.fuente
+1#.i.*0=i.|]i.|]una gran mejora en mi enfoque. Sin embargo, no entiendo completamente esta parte:+1#.i.¿podría explicarlo?1#.es la conversión de base 1, que es equivalente a+/"1. Primeroi.|]para obtener los restos, luego0=para encontrar los iguales a 0 (los divisores), luegoi.*poner a cero los no divisores en el rango, luego sumar usando1#., luego sumar+ya quei.es un rango exclusivo.Java (OpenJDK 8) ,
5351 bytesPruébalo en línea!
fuente
Haskell , 30 bytes
Pruébalo en línea!
fuente
MATL , 6 bytes
Pruébalo en línea!
-4 bytes gracias a @LuisMendo
10 bytes
Mi solución anterior usando un bucle
Pruébalo en línea!
3 bytes
Usando incorporado
Pruébalo en línea!
fuente
Javascript,
5444 bytesGuardado 10 bytes gracias a Shaggy
Pruébalo en línea!
fuente
Brain-Flak , 96 bytes
Pruébalo en línea!
Explicación:
Ahora anticuado por mejoras.
El corazón del algoritmo es este:
Que es una modificación de mod que nos dará
Msi se trata de un factor deNy0de otra manera. El código completo está abajo.fuente
R ,
3126 bytesPruébalo en línea!
Devuelve una
1x1matriz.Calcula
!N%%xelementosdde mapas de1:Npor:d->(1 if d divides N, 0 otherwise)Entonces
x%*%x!N%%xes el producto matricial1:Ncuyo resultado es la suma dexdónde!N%%xestá1. ¡Ordenado! Técnicamente un puerto de la respuesta Octave de Luis Mendo, pero solo lo vi después de pensar en esto.Números R +, 14 bytes
Pruébalo en línea!
fuente
N=scan();numbers::Sigma(N)? De esta manera, genera el código fuente de la funciónSigma.JavaScript, 31 bytes
fuente
Pari / GP , 5 bytes
Pruébalo en línea!
fuente
Python 2 , 41 bytes
Pruébalo en línea!
fuente
VBA (Excel), 73 bytes
fuente
Sub Y...End Subpara obtener la solución de 85 BytesSub yA=Cells(1,1)x=1While x<=AIf A Mod x=0 Then b=b+xx=x+1WendMsgBox bEnd SubSub yWhile x<=[A1]x=x+1If [A1]Mod x=0Then b=b+xWendDebug.?bEnd Subque asume que se ejecuta en un módulo limpio (x = valor int predeterminado0) y se envía a la ventana inmediata de VBE (?autoformatos paraPrint)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?bque supone quex,bson el valor por defecto de 0 y salidas a la ventana inmediata VBE (de la ventana inmediata de VBE?es equivalente aDebug.Print)Pyth , 6 bytes
Pruébalo aquí!
Pyth no tiene divisores incorporados, así que creo que esto es razonable.
Explicación
s * M {yP - Programa completo con entrada implícita. P - Los factores primos de la entrada. y - El conjunto de poder de sus factores primos. {- Deduplicar. * M - Mapa con multiplicación. s - Suma. - Mostrar implícitamente el resultado.Dado
20, por ejemplo, esto es lo que hace nuestro programa después de cada instrucción: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.fuente
Ohm v2 , 2 bytes
Pruébalo en línea!
Esto es bastante sencillo:
fuente
Casco , 5 bytes
Pruébalo en línea!
¿Cómo?
ṁΠuṖp: programa completo, entrada implícita. p - Factores primos. Ṗ - Powerset. u - Eliminar duplicados. ṁΠ - Obtenga el producto de cada lista, suma y salida implícita.¡Gracias a Zgarb por las sugerencias en el chat!
fuente
Octava , 20 bytes
Pruébalo en línea!
fuente
RProgN 2 , 2 bytes
Explicado
Trivial, pero sentí que necesitaba ser publicado.
Pruébalo en línea!
fuente
Perl 5 , 35 + 1 (-p) = 36 bytes
Pruébalo en línea!
fuente
Bash + utilidades GNU, 36
Pruébalo en línea .
Pure Bash, 41
Pruébalo en línea .
Primero probé una elegante respuesta de expansión de bash, pero terminó siendo más larga que el simple ciclo anterior:
fuente
Añadir ++ , 9 bytes
Pruébalo en línea!
Claramente llegué aquí demasiado tarde. Esto define una función que obtiene los factores y luego los suma.
fuente
QBIC , 17 bytes
Explicación
fuente
Gaia , 2 bytes
Pruébalo en línea!
Muy claro:
fuente