Un desafío simple pero con suerte no del todo trivial:
Escriba un programa o función que sume los k
poderes th que dividen un número n
. Más específicamente:
- Entrada: dos enteros positivos
n
yk
(o un par ordenado de enteros, etc.) - Salida: la suma de todos los divisores positivos de
n
eso son lask
potencias de los enteros
Por ejemplo, 11! = 39916800 tiene seis divisores que son cubos, a saber, 1, 8, 27, 64, 216, y 1728. Por lo tanto entradas dadas 39916800
y 3
, el programa debe devolver su suma, 2044
.
Otros casos de prueba:
{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
Este es el código de golf, así que cuanto más corto sea el código, mejor. Doy la bienvenida al código de golf en todo tipo de idiomas diferentes, incluso si algún otro idioma puede escapar con menos bytes que el tuyo.
code-golf
arithmetic
number-theory
integer
Greg Martin
fuente
fuente
Respuestas:
05AB1E , 9 bytes
Pruébalo en línea!
Explicación
Entrada de ejemplo
46656, 3
fuente
Mathematica, 28 bytes
Toma de funciones sin nombre
n
yk
como entradas en ese orden.fuente
DivisorSum
está frustrantemente cerca de ser útil aquí.Haskell ,
37 3534 bytesPruébalo en línea! Uso:
El código es bastante ineficiente porque siempre computa
1^k, 2^k, ..., n^k
.Editar: guardado un byte gracias a Zgarb.
Explicación:
fuente
mod n(x^k)
puede sern`mod`x^k
.Python 2,
5452 bytesGracias @Rod por cortar 2 bytes.
fuente
x%i**n==0
conx%i**n<1
, y moverse al otro lado comoi**n*(x%i**n<1)
Ruby, 45 bytes
Sería más corto usando "sum" en Ruby 2.4. ¿Hora de actualizar?
fuente
MATL , 10 bytes
Pruébalo en línea!
Cómo funciona
Ejemplo con
46656
,6
.fuente
Jalea ,
76 bytes-1 byte gracias a Dennis (atraviesa un rango implícito)
Una eficiencia inteligente que también ahorra Dennis a un costo de 0 bytes
(Anteriormente
ÆDf*€S
filtraría mantener esos divisores que son una potencia de k de cualquier número natural hasta n . Pero tenga en cuenta que n puede ¡solo tengo un divisor de i k si tiene un divisor de i de todos modos!)Pruébalo en línea!
¿Cómo?
fuente
JavaScript (ES7),
5653 bytesToma
n
yk
en sintaxis curry(n)(k)
.Casos de prueba
Mostrar fragmento de código
fuente
Perl 6 , 39 bytes
Cómo funciona
Intentalo
fuente
Japt , 10 bytes
Ahorró muchos bytes gracias a @ETHproductions
Explicación
¡Pruébelo en línea!
fuente
vU
Detecta números divisibles porU
o números que se dividenU
?fvU
filtra a los elementos que son divisibles porU
;f!vU
filtra a los elementos queU
es divisible por.!
intercambia los argumentos.Scala 63 bytes
fuente
Python 2 , 50 bytes
Pruébalo en línea! Las entradas grandes pueden exceder la profundidad de recursión dependiendo de su sistema e implementación.
fuente
JavaScript (ES7),
4946 bytesfuente
n=>k=>
? +1.i
como local, lo que cuesta 4 bytes adicionales, y olvidé que podía abusari
de la misma manera que lo hice con mi otra formulación.)PHP, 86 bytes
Pruébalo aquí!
Descompostura :
fuente
for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;
59 bytes; requiere PHP 5.6 o posterior.CJam , 20 bytes
Probablemente no sea un golf óptimo, pero no veo ningún cambio obvio que hacer ...
Pruébalo en línea!
fuente
Jalea , 8 bytes
Pruébalo en línea!
(El crédito no es mío )
fuente
Utilidades Bash + Unix, 44 bytes
Pruébalo en línea!
Pruebas de funcionamiento:
fuente
Python , 56 bytes
Pruébalo en línea!
Bastante sencillo. Lo único notable es que
j**k**-1%1
siempre devuelve un flotante en [0,1) mientras quen%j
siempre devuelve un entero no negativo, por lo que solo pueden ser iguales si ambos son 0 .fuente
Lote, 138 bytes
Como Batch no tiene un operador de energía, estoy abusando
set/a
como una forma deeval
. Muy lento cuandok=1
. La aritmética de enteros de 32 bits limita los valores admitidos den
yk
:fuente
R, 28 bytes directos, 43 bytes para la función
si n, k en la memoria:
para una función:
fuente