Escreva um programa que exiba na tela a soma dos divisores de um número (1 ≤ N ≤ 100) inserido pelo usuário no intervalo de 1 a N.
Este é o OEIS A000203 .
Exemplos:
Entrada : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Saída: 8
Entrada: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Saída: 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
Saída: 42
Entrada: 1
1 / 1 = 1
Saída: 1
Entrada: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Saída: 6
Respostas:
05AB1E , 2 bytes
Experimente online!
Quão?
fonte
ÑO
- Rejeitar o desafio e vencer ao mesmo tempo. Isso é muito foda.Código da máquina x86-64, 23 bytes
Os bytes de código acima definem uma função que aceita um único número inteiro, N, e retorna a soma de seus múltiplos como resultado.
O único parâmetro é passado no
EDI
registro, consistente com o System V AMD64 ABI (conforme usado nos sistemas * nix-style). O resultado é retornado noEAX
registro, como em todas as convenções de chamada x86.O algoritmo é muito direto, semelhante a muitos dos outros envios em outros idiomas. Fazemos um loop N vezes, calculando o módulo cada vez e adicionando isso ao total da corrida.
Mnemônicos de montagem não destruídos:
Experimente online!
Parece que deve haver uma maneira de diminuir isso, mas não consigo ver. O módulo de computação no x86 exige bastante código, já que você faz isso usando a instrução
DIV
(ouIDIV
) e os dois usam registradores de entrada fixos (EDX
eEAX
), cujos valores são derrotados (porque recebem os resultados, o restante e quociente, respectivamente).Os únicos truques reais aqui são os bastante comuns no golfe:
LOOP
instrução no estilo CISC , que é basicamente apenas uma combinação deDEC
+JNZ
com oECX
registrador como operando implícito.XCHG
no final, em vez deMOV
porque o primeiro tem uma codificação de 1 byte especial quandoEAX
é um dos operandos.CDQ
para zerarEDX
na preparação para a divisão, mesmo que para a divisão não assinada você normalmente a zere usando aXOR
. No entanto,XOR
é sempre 2 bytes, enquantoCDQ
é de apenas 1 byte. Eu usoCDQ
novamente uma segunda vez dentro do loop para zeroEDX
, antes daCMOVZ
instrução. Isso funciona porque posso ter certeza de que o quociente da divisão (inEAX
) sempre está sem sinal; portanto, uma extensão de sinal emEDX
será definidaEDX
como 0.fonte
C (gcc), 45 bytes
Experimente online!
fonte
Japonês , 3 bytes
Experimente online!
fonte
â x
-x
, pode ser um byteBraquilog , 2 bytes
Experimente online!
Explicação
fonte
Mathematica, 14 bytes
ou uma resposta de @Loki
Mathematica, 17 bytes
fonte
Tr@Divisors@#&
ainda melhor ;-)f=
que leva uma entrada f [x] é por isso que eu apresentá-lo neste way.Welcome para PPCGTr@*Divisors
para cortar um byte.C, C ++, C #, D, Java,
6562 bytesIsso funciona em todas as 5 linguagens de programação por causa de semelhanças.
Otimização C, C ++ e D:
6260 bytesEm C ++ e D, números inteiros são convertidos implicitamente em booleanos (Zero => false, Not Zero => true), portanto, você não precisa ter o
!=0
Otimização D: sistema de modelos de golfe, 55 bytes
Código a testar :
C:
C ++:
C #:
D:
Java:
fonte
n%i
/n%i!=0
em qualquer um dos idiomas. Segundo, sua primeira solução deve ser capaz de ter emn%i>0
vez den%i!=0
. Terceiro, a solução de D pode serT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
abusar do sistema de modelos e dos valores padrão.Shnap ,
4443 bytes-1 bye graças ao Sr. Xcoder (lol eu fui derrotado no meu próprio idioma)
Esta é uma função (
$
inicia uma função no Shnap).Experimente online!
Explicação:
Não-competidor, 19 bytes
Após muitas atualizações de idioma, isso agora pode ser reduzido para apenas 19 bytes:
Experimente online!
fonte
==0
é<1
( 43 bytes )Python, 44 bytes
fonte
J, 23 bytes
Experimente online!
Para os fãs de J, existe uma solução inteligente de 13 bytes :
>:@#.~/.~&.q:
mas como essa não foi minha invenção, não a publicarei como minha resposta oficial.Minha própria solução simplesmente filtra 1..n, localizando divisores e depois os soma. O ponto crucial é o garfo diádico
Observe que neste contexto
]
é 1..n e[
é n em si. Portanto,]|[
são os restantes ao dividir cada elemento de 1..n em n e=&0
informa se são iguais a 0.fonte
+1#.i.*0=i.|]
i.|]
uma grande melhoria na minha abordagem. Não entendo completamente essa parte:+1#.i.
- você poderia explicar?1#.
é a conversão de base 1, que é equivalente a+/"1
. Primeiro,i.|]
para obter os restantes, depois0=
encontrar os iguais a 0 (os divisores), depoisi.*
zerar os não-divisores no intervalo, depois somar usando e1#.
, em seguida, adicionar-+
se, poisi.
é um intervalo exclusivo.Java (OpenJDK 8) ,
5351 bytesExperimente online!
fonte
Haskell , 30 bytes
Experimente online!
fonte
MATL , 6 bytes
Experimente online!
-4 bytes graças a @LuisMendo
10 bytes
Minha solução anterior usando um loop
Experimente online!
3 bytes
Usando built-in
Experimente online!
fonte
Javascript,
5444 bytesEconomizou 10 bytes graças a Shaggy
Experimente online!
fonte
Brain-Flak , 96 bytes
Experimente online!
Explicação:
Agora desatualizado por melhorias.
O coração do algoritmo é este:
Essa é uma modificação no mod que nos dará
M
se é um fator deN
ou0
não. O código completo está abaixo.fonte
R ,
3126 bytesExperimente online!
Retorna uma
1x1
matriz.Computa os
!N%%x
elementosd
de mapas1:N
por:d->(1 if d divides N, 0 otherwise)
Então
x%*%x!N%%x
é o produto da matriz1:N
que resulta na soma dex
onde!N%%x
está1
. Arrumado! Tecnicamente, um porto da resposta Octave de Luis Mendo mas só vi isso depois de pensar nisso.Números R +, 14 bytes
Experimente online!
fonte
N=scan();
numbers::Sigma(N)
? Assim, ele gera o código fonte da funçãoSigma
.JavaScript, 31 bytes
fonte
Pari / GP , 5 bytes
Experimente online!
fonte
Python 2 , 41 bytes
Experimente online!
fonte
VBA (Excel), 73 bytes
fonte
Sub Y
...End Sub
para obter a solução 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 assume que é executado num módulo limpo (x = int valor padrão,0
) e saídas para a janela imediato do VBE (?
AutoFormats aPrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
que pressupõe quex
,b
são o valor padrão de 0 e saem para a janela imediata do VBE (de janela imediato do VBE?
é equivalente aDebug.Print
)Pitão , 6 bytes
Experimente aqui!
Pyth não tem um built-in para divisores, então acho que isso é razoável.
Explicação
Dado
20
, por exemplo, é isso que nosso programa faz após cada instrução: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
.fonte
Ohm v2 , 2 bytes
Experimente online!
Isso é bastante direto:
fonte
Casca , 5 bytes
Experimente online!
Quão?
Obrigado ao Zgarb pelas sugestões no chat!
fonte
Oitava , 20 bytes
Experimente online!
fonte
RProgN 2 , 2 bytes
Explicado
Trivial, mas achou que precisava ser publicado.
Experimente online!
fonte
Perl 5 , 35 + 1 (-p) = 36 bytes
Experimente online!
fonte
Utilitários Bash + GNU, 36
Experimente online .
Pure Bash, 41
Experimente online .
Tentei pela primeira vez uma resposta sofisticada de expansão do bash, mas acabou sendo mais longa que o loop simples acima:
fonte
Adicione ++ , 9 bytes
Experimente online!
Eu claramente cheguei aqui tarde demais. Isso define uma função que obtém os fatores e os soma.
fonte
QBIC , 17 bytes
Explicação
fonte
Gaia , 2 bytes
Experimente online!
Bem direto:
fonte