Um desafio simples, mas espero que não seja trivial:
Escreva um programa ou função que adicione os k
th poderes dividindo um número n
. Mais especificamente:
- Entrada: dois números inteiros positivos
n
ek
(ou um par ordenado de números inteiros, etc.) - Saída: a soma de todos os divisores positivos dos
n
quais são ask
potências de números inteiros
Por exemplo, 11! = 39916800 possui seis divisores que são cubos, ou seja, 1, 8, 27, 64, 216 e 1728. Portanto, dadas as entradas 39916800
e 3
, o programa deve retornar sua soma 2044
,.
Outros casos de teste:
{40320, 1} -> 159120
{40320, 2} -> 850
{40320, 3} -> 73
{40320, 4} -> 17
{40320, 5} -> 33
{40320, 6} -> 65
{40320, 7} -> 129
{40320, 8} -> 1
{46656, 1} -> 138811
{46656, 2} -> 69700
{46656, 3} -> 55261
{46656, 4} -> 1394
{46656, 5} -> 8052
{46656, 6} -> 47450
{46656, 7} -> 1
{1, [any positive integer]} -> 1
Isso é código de golfe, portanto, quanto menor o seu código, melhor. Congratulo-me com o código de golfe em todos os tipos de idiomas diferentes, mesmo que algum outro idioma possa se livrar com menos bytes que o seu.
code-golf
arithmetic
number-theory
integer
Greg Martin
fonte
fonte
Respostas:
05AB1E , 9 bytes
Experimente online!
Explicação
Exemplo de entrada
46656, 3
fonte
Mathematica, 28 bytes
Função sem nome
n
ek
como entradas nessa ordem.fonte
DivisorSum
é frustrantemente próximo de ser útil aqui.Haskell ,
37 3534 bytesExperimente online! Uso:
O código é bastante ineficiente porque sempre calcula
1^k, 2^k, ..., n^k
.Editar: salvou um byte graças ao Zgarb.
Explicação:
fonte
mod n(x^k)
pode sern`mod`x^k
.Python 2,
5452 bytesObrigado @Rod por cortar 2 bytes.
fonte
x%i**n==0
porx%i**n<1
e passar para o outro lado comoi**n*(x%i**n<1)
Ruby, 45 bytes
Seria mais curto usando "sum" no Ruby 2.4. Hora de atualizar?
fonte
MATL , 10 bytes
Experimente online!
Como funciona
Exemplo com
46656
,6
.fonte
Geléia ,
76 bytes-1 byte graças a Dennis (percorra um intervalo implícito)
Uma eficiência inteligente economizada também por Dennis a um custo de 0 byte
(Anteriormente
ÆDf*€S
, o filtro manteria os divisores que são uma potência de k de qualquer número natural até n . Mas observe que n pode só tenha um divisor de i k se tiver um divisor de i de qualquer maneira!)Experimente online!
Quão?
fonte
JavaScript (ES7),
5653 bytesToma
n
ek
na currying sintaxe(n)(k)
.Casos de teste
Mostrar snippet de código
fonte
Perl 6 , 39 bytes
Como funciona
Tente
fonte
Japonês , 10 bytes
Economizou muitos bytes graças a @ETHproductions
Explicação
Teste online!
fonte
vU
detectar números divisíveis porU
, ou números que divideU
?fvU
filtra itens que são divisíveis porU
;f!vU
filtra itens queU
são divisíveis por.!
troca os argumentos.Scala 63 bytes
fonte
Python 2 , 50 bytes
Experimente online! Entradas grandes podem exceder a profundidade da recursão, dependendo do seu sistema e implementação.
fonte
JavaScript (ES7),
4946 bytesfonte
n=>k=>
? +1.i
como um local, que custa 4 bytes extras, e se esqueceu de que eu poderia abusari
da mesma maneira que eu fiz com a minha outra formulação.)PHP, 86 bytes
Experimente aqui!
Demolir :
fonte
for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;
59 bytes; requer PHP 5.6 ou posterior.CJam , 20 bytes
Provavelmente não é o ideal, mas não vejo nenhuma mudança óbvia a ser feita ...
Experimente online!
fonte
Geléia , 8 bytes
Experimente online!
(O crédito não é meu. )
fonte
Utilitários Bash + Unix, 44 bytes
Experimente online!
Execuções de teste:
fonte
Python , 56 bytes
Experimente online!
Bastante direto. A única coisa digna de nota é que
j**k**-1%1
sempre retorna um ponto flutuante em [0,1) enquanton%j
sempre retorna um número inteiro não negativo; portanto, eles só podem ser iguais se ambos forem 0 .fonte
Lote, 138 bytes
Como o Lote não tem um operador de energia, estou abusando
set/a
como uma forma deeval
. Muito lento quandok=1
. A aritmética de número inteiro de 32 bits limita os valores suportados den
ek
:fonte
R, 28 bytes diretos, 43 bytes para função
se n, k na memória:
para uma função:
fonte