Jumlahkan kekuatan yang ada

35

Tantangan yang sederhana namun mudah-mudahan tidak sepele:

Tulis program atau fungsi yang menambah kkekuatan membagi angka n. Lebih spesifik:

  • Input: dua bilangan bulat positif ndan k(atau sepasang bilangan bulat yang dipesan, dll.)
  • Output: jumlah dari semua pembagi positif nyang merupakan kkekuatan bilangan bulat

Misalnya, 11! = 39916800 memiliki enam pembagi yang berbentuk kubus, yaitu 1, 8, 27, 64, 216, dan 1728. Oleh karena itu masukan yang diberikan 39916800dan 3, program harus mengembalikan jumlah mereka 2044,.

Kasus uji lainnya:

{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

Ini adalah kode golf, jadi semakin pendek kode Anda, semakin baik. Saya menyambut kode golf dalam semua jenis bahasa yang berbeda, bahkan jika beberapa bahasa lain dapat lolos dengan byte lebih sedikit dari milik Anda.

Greg Martin
sumber
12
Ketika saya pertama kali melihat tantangan Anda, saya merasa aneh bahwa itu adalah judul lagu Metallica.
Arnauld
1
Apa? Tidak ada Mathematica bawaan untuk ini?
boboquack

Jawaban:

13

05AB1E , 9 byte

DLImDŠÖÏO

Cobalah online!

Penjelasan

Contoh 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
Emigna
sumber
6

Mathematica, 28 byte

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

Fungsi yang tidak disebutkan namanya mengambil ndan ksebagai input dalam urutan itu.

Martin Ender
sumber
2
DivisorSumsangat dekat menjadi berguna di sini.
ngenisis
5

Haskell , 37 35 34 byte

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

Cobalah online! Pemakaian:

Prelude> 40320 ! 1
159120

Kode ini sangat tidak efisien karena selalu menghitung 1^k, 2^k, ..., n^k.

Sunting: Disimpan satu byte berkat Zgarb.

Penjelasan:

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
Laikoni
sumber
1
mod n(x^k)bisa 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))

Terima kasih @Rod untuk memotong 2 byte.

hashcode55
sumber
Anda dapat menggantinya x%i**n==0dengan x%i**n<1, dan pindah ke sisi lain sebagaii**n*(x%i**n<1)
Rod
4

Ruby, 45 byte

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

Akan lebih pendek menggunakan "jumlah" di Ruby 2.4. Waktunya untuk upgrade?

GB
sumber
4
Saatnya untuk meningkatkan.
Yytsi
4

MATL , 10 byte

t:i^\~5M*s

Cobalah online!

Bagaimana itu bekerja

Misalnya dengan 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
Luis Mendo
sumber
4

Jelly , 7 6 byte

-1 byte berkat Dennis (melintasi rentang implisit)
Efisiensi yang cerdik hemat juga oleh Dennis dengan biaya 0-byte
(Sebelumnya ÆDf*€Sakan memfilter menjaga pembagi yang memiliki kekuatan k dari setiap bilangan alami hingga n . Tetapi perhatikan bahwa n tidak dapat hanya pernah memiliki pembagi i k jika tetap memiliki pembagi i !)

ÆDf*¥S

Cobalah online!

Bagaimana?

Æ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
Jonathan Allan
sumber
3

JavaScript (ES7), 56 53 byte

Membawa ndan kdalam sintaks currying (n)(k).

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

Uji kasus

Arnauld
sumber
3

Perl 6 , 39 byte

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

Bagaimana itu bekerja

->\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.

Cobalah

seseorang
sumber
2

Japt , 10 byte

Banyak byte yang disimpan berkat @ETHproductions

òpV f!vU x

Penjelasan

ò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

Uji secara online!

Oliver
sumber
Apakah vUmendeteksi angka yang dapat dibagi dengan U, atau angka yang membagi U?
Greg Martin
@GregMartin fvUmemfilter ke item yang dapat dibagi oleh U; f!vUmemfilter ke item yang Udapat dibagi oleh. !menukar argumen.
Oliver
Keren, jadi kodenya terlihat benar, tetapi penjelasannya mungkin perlu diubah.
Greg Martin
@GregMartin Seharusnya lebih jelas sekarang.
ETHproduk
2

Scala 63 byte

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

Python 2 , 50 byte

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

Cobalah online! Input besar dapat melebihi kedalaman rekursi tergantung pada sistem dan implementasi Anda.

Tidak
sumber
2

JavaScript (ES7), 49 46 byte

n=>g=(k,t=i=0,p=++i**k)=>p>n?t:g(k,t+p*!(n%p))
Neil
sumber
Karena Anda tidak berulang, mengapa tidak n=>k=>? +1.
Yytsi
@ TuukkaX saya datang dengan sesuatu yang lebih baik. (Saya benar-benar memiliki ini sebelumnya dengan isebagai lokal, yang biaya 4 byte tambahan, dan lupa bahwa saya bisa menyalahgunakan idengan cara yang sama saya lakukan dengan formulasi saya yang lain.)
Neil
1

PHP, 86 byte

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

Coba di sini!

Kerusakan :

$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!)
roberto06
sumber
golf, tetapi tidak diuji: for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;59 byte; membutuhkan PHP 5.6 atau lebih baru.
Titus
1

CJam , 20 byte

Mungkin tidak golf secara optimal, tapi saya tidak melihat perubahan yang jelas untuk membuat ...

ri:N,:)rif#{N\%!},:+

Cobalah online!

Kucing Bisnis
sumber
1

Utilitas Bash + Unix, 44 byte

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

Cobalah online!

Tes berjalan:

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
Mitchell Spector
sumber
1

Python , 56 byte

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

Cobalah online!

Cukup mudah. Satu-satunya hal yang patut dicatat adalah bahwa j**k**-1%1selalu mengembalikan float di [0,1) sementara n%jselalu mengembalikan integer non-negatif, sehingga mereka hanya bisa sama jika keduanya bernilai 0 .

Dennis
sumber
1

Batch, 138 byte

@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%

Karena Batch tidak memiliki operator listrik, saya menyalahgunakan set/asebagai bentuk eval. Sangat lambat kapan k=1. Aritmatika integer 32-bit membatasi nilai yang didukung ndan 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
Neil
sumber
0

R, 28 byte langsung, 43 byte untuk fungsi

jika n, k dalam memori:

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

untuk suatu fungsi:

r=function(n,k)sum((n%%(1:n)^k==0)*(1:n)^k)
Zahiro Mor
sumber