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
EDI
registro, de acuerdo con el System V AMD64 ABI (como se usa en los sistemas de estilo * nix). El resultado se devuelve en elEAX
registro, 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 (EDX
yEAX
), 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:
LOOP
instrucción de estilo CISC , que es básicamente una combinación deDEC
+JNZ
con elECX
registro como el operando implícito.XCHG
al final en lugar deMOV
porque el primero tiene una codificación especial de 1 byte cuandoEAX
es uno de los operandos.CDQ
poner a ceroEDX
en la preparación para la división, aunque para la división sin signo, normalmente lo pondría a cero usando aXOR
. Sin embargo,XOR
siempre tiene 2 bytes, mientrasCDQ
que solo tiene 1 byte. UtilizoCDQ
nuevamente una segunda vez dentro del ciclo a ceroEDX
, antes de laCMOVZ
instrucció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ónEDX
se estableceráEDX
igual 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@*Divisors
para 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
!=0
Optimización D: sistema de plantillas de golf, 55 bytes
Código para probar :
C :
C ++:
C# :
D:
Java:
fuente
n%i
/n%i!=0
en ninguno de los idiomas. En segundo lugar, su primera solución debería poder tenerla enn%i>0
lugar 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
==0
es<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=&0
le 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á
M
si se trata de un factor deN
y0
de otra manera. El código completo está abajo.fuente
R ,
3126 bytesPruébalo en línea!
Devuelve una
1x1
matriz.Calcula
!N%%x
elementosd
de mapas de1:N
por:d->(1 if d divides N, 0 otherwise)
Entonces
x%*%x!N%%x
es el producto matricial1:N
cuyo resultado es la suma dex
dónde!N%%x
está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 Sub
para obtener la solución de 85 BytesSub 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
que 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:?b
que supone quex
,b
son 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
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?
¡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