Somma i poteri che sono


35

Una sfida semplice ma speriamo non abbastanza banale:

Scrivi un programma o una funzione che somma i kpoteri che dividono un numero n. Più specificamente:

  • Input: due numeri interi positivi ne k(o una coppia ordinata di numeri interi, ecc.)
  • Output: la somma di tutti i divisori positivi nche sono ki poteri di numeri interi

Ad esempio, 11! = 39916800 ha sei divisori che sono cubi, cioè 1, 8, 27, 64, 216 e 1728. Pertanto determinati input 39916800e 3, il programma dovrebbe restituire loro somma, 2044.

Altri casi di test:

{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

Questo è il golf del codice, quindi più breve è il codice, meglio è. Accolgo con favore il codice golf in tutti i tipi di lingue diverse, anche se qualche altra lingua può cavarsela con meno byte della tua.


12
Quando ho visto per la prima volta la tua sfida, ho avuto la strana sensazione che fosse un titolo di canzone dei Metallica.
Arnauld,

1
Che cosa? Non c'è Mathematica integrato per questo?
boboquack,

Risposte:


13

05AB1E , 9 byte

DLImDŠÖÏO

Provalo online!

Spiegazione

Esempio di input 46656, 3

D          # duplicate first input
           # STACK: 46656, 46656
 L         # range [1 ... first input]
           # STACK: 46656, [1 ... 46656]
  Im       # each to the power of second input
           # STACK: 46656, [1, 8, 27 ...]
    D      # duplicate
           # STACK: 46656, [1, 8, 27 ...], [1, 8, 27 ...]
     Š     # move down 2 spots on the stack
           # STACK: [1, 8, 27 ...], 46656, [1, 8, 27 ...]
      Ö    # a mod b == 0
           # STACK: [1, 8, 27 ...], [1,1,1,1,0 ...]
       Ï   # keep only items from first list which are true in second
           # STACK: [1, 8, 27, 64, 216, 729, 1728, 5832, 46656]
        O  # sum
           # OUTPUT: 55261

6

Mathematica, 28 byte

Tr[Divisors@#⋂Range@#^#2]&

Assunzione di funzioni senza nome ne kcome input in quell'ordine.


2
DivisorSumè frustrantemente vicino ad essere utile qui.
ngenesi,

5

Haskell , 37 35 34 byte

n!k=sum[x^k|x<-[1..n],n`mod`x^k<1]

Provalo online! Uso:

Prelude> 40320 ! 1
159120

Il codice è abbastanza inefficiente perché viene sempre calcolato 1^k, 2^k, ..., n^k.

Modifica: salvato un byte grazie a Zgarb.

Spiegazione:

n!k=             -- given n and k, the function ! returns
 sum[x^k|        -- the sum of the list of all x^k
   x<-[1..n],    -- where x is drawn from the range 1 to n
   n`mod`x^k<1]  -- and n modulus x^k is less than 1, that is x^k divides n

1
mod n(x^k)può essere n`mod`x^k.
Zgarb,

5

Python 2, 54 52 byte

lambda x,n:sum(i**n*(x%i**n<1)for i in range(1,-~x))

Grazie a @Rod per aver tagliato 2 byte.


Puoi sostituirlo x%i**n==0con x%i**n<1e spostarti dall'altra parte comei**n*(x%i**n<1)
Rod

4

Rubino, 45 byte

->n,m{(1..n).reduce{|a,b|n%(c=b**m)<1?a+c:a}}

Sarebbe più breve usando "sum" in Ruby 2.4. È ora di eseguire l'aggiornamento?


4
È ora di aggiornare.
Yytsi,

4

MATL , 10 byte

t:i^\~5M*s

Provalo online!

Come funziona

Esempio con 46656, 6.

t      % Implicitly input n. Duplicate
       % STACK: 46656, 46656
:      % Range
       % STACK: 46656, [1 2 ... 46656]
i      % Input k
       % STACK: 46656, [1 2 ... 46656], 6
^      % Power, element-wise
       % STACK: 46656, [1 64 ... 46656^6]
\      % Modulo
       % STACK: [0 0 0 1600 ...]
~      % Logically negate
       % STACK: [true true true false ...]
5M     % Push second input to function \ again
       % STACK: [true true true false ...], [1^6 2^6 ... 46656^6]
*      % Multiply, element-wise
       % STACK: [1 64 729 0 ...]
s      % Sum of array: 47450
       % Implicitly display

4

Gelatina , 7 6 byte

-1 byte grazie a Dennis (attraversa un intervallo implicito)
Un'efficienza intelligente salva anche da Dennis al costo di 0 byte
(in precedenza il ÆDf*€Sfiltro avrebbe mantenuto quei divisori che sono una potenza di k di qualsiasi numero naturale fino a n . Ma nota che n può sempre e solo avere un divisore di i k se ha un divisore dei comunque!)

ÆDf*¥S

Provalo online!

Come?

ÆDf*¥S - Main link: n, k
ÆD     - divisors of n  -> divisors = [1, d1, d2, ..., n]
    ¥  - last two links as a dyadic chain
  f    -     filter divisors keeping those that appear in:
   *   -     exponentiate k with base divisors (vectorises)
       - i.e. [v for v in [1, d1, d2, ..., n] if v in [1^k, d1^k, ..., n^k]]
     S - sum

3

JavaScript (ES7), 56 53 bytes

Takes n and k in currying syntax (n)(k).

n=>k=>[...Array(n)].reduce(p=>n%(a=++i**k)?p:p+a,i=0)

Test cases


3

Perl 6, 39 bytes

->\n,\k{sum grep n%%*,({++$**k}...*>n)}

How it works

->\n,\k{                              }  # A lambda taking two arguments.
                        ++$              # Increment an anonymous counter
                           **k           # and raise it to the power k,
                       {      }...       # generate a list by repeatedly doing that,
                                  *>n    # until we reach a value greater than n.
            grep n%%*,(              )   # Filter factors of n from the list.
        sum                              # Return their sum.

Try it


2

Japt, 10 bytes

Saved lots of bytes thanks to @ETHproductions

òpV f!vU x

Explanation

òpV f!vU x
ò           // Creates a range from 0 to U
 pV         // Raises each item to the power of V (Second input)
    f       // Selects all items Z where
     !vU    //   U is divisible by Z
            //   (fvU would mean Z is divisible by U; ! swaps the arguments)
         x  // Returns the sum of all remaining items

Test it online!


Does vU detect numbers divisible by U, or numbers that divide U?
Greg Martin

@GregMartin fvU filters to items that are divisible by U; f!vU filters to items that U is divisible by. ! swaps the arguments.
Oliver

Cool, so the code looks right, but the explanation might need to be tweaked.
Greg Martin

@GregMartin Should be clearer now.
ETHproductions

2

Scala 63 bytes

(n:Int,k:Int)=>1 to n map{Math.pow(_,k).toInt}filter{n%_==0}sum

2

Python 2, 50 bytes

f=lambda n,k,i=1:n/i and(n%i**k<1)*i**k+f(n,k,i+1)

Try it online! Large inputs may exceed the recursion depth depending on your system and implementation.


2

JavaScript (ES7), 49 46 bytes

n=>g=(k,t=i=0,p=++i**k)=>p>n?t:g(k,t+p*!(n%p))

Since you aren't recursing, why not n=>k=>? +1.
Yytsi

@TuukkaX I came up with something better. (I actually had this earlier with i as a local, which costs 4 extra bytes, and forgot that I could abuse i in the same way that I did with my other formulation.)
Neil

1

PHP, 86 bytes

$n=$argv[1];$k=$argv[2];for($i=1;$i<=$n**(1/$k);$i++)if($n%$i**$k<1)$s+=$i**$k;echo$s;

Try it here !

Breakdown :

$n=$argv[1];$k=$argv[2];       # Assign variables from input
for($i=1;$i<=$n**(1/$k);$i++)  # While i is between 1 AND kth root of n
    if($n%$i**$k<1)            #     if i^k is a divisor of n
        $s+=$i**$k;            #         then add to s
echo$s;                        # echo s (duh!)

golfed, but not tested: for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s; 59 bytes; requires PHP 5.6 or later.
Titus



1

Bash + Unix utilities, 44 bytes

bc<<<`seq "-fx=%.f^$2;s+=($1%%x==0)*x;" $1`s

Try it online!

Test runs:

for x in '40320 1' '40320 2' '40320 3' '40320 4' '40320 5' '40320 6' '40320 7' '40320 8' '46656 1' '46656 2' '46656 3' '46656 4' '46656 5' '46656 6' '46656 7' '1 1' '1 2' '1 3' '1 12' ; do echo -n "$x "; ./sumpowerdivisors $x; done

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 1 1
1 2 1
1 3 1
1 12 1

1

Python, 56 bytes

lambda n,k:sum(j*(j**k**-1%1==n%j)for j in range(1,n+1))

Try it online!

Fairly straightforward. The only noteworthy thing is that j**k**-1%1 always returns a float in [0,1) while n%j always returns a non-negative integer, so they can only be equal if both are 0.


1

Batch, 138 bytes

@set s=n
@for /l %%i in (2,1,%2)do @call set s=%%s%%*n
@set/at=n=0
:l
@set/an+=1,p=%s%,t+=p*!(%1%%p)
@if %p% lss %1 goto l
@echo %t%

Since Batch doesn't have a power operator, I'm abusing set/a as a form of eval. Very slow when k=1. 32-bit integer arithmetic limits the supported values of n and k:

           n   k
  (too slow)   1
 <1366041600   2
 <1833767424   3
 <2019963136   4
 <2073071593   5
 <1838265625   6
 <1801088541   7
 <1475789056   8
 <1000000000   9
 <1073741824  10
 <1977326743  11
  <244140625  12
 <1220703125  13
  <268435456  14
 <1073741824  15
   <43046721  16
  <129140163  17
  <387420489  18
 <1162261467  19
    <1048576  20
           ...
 <1073741824  30

0

R, 28 bytes direct, 43 bytes for function

if n,k in memory:

sum((n%%(1:n)^k==0)*(1:n)^k)

for a function:

r=function(n,k)sum((n%%(1:n)^k==0)*(1:n)^k)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.