Güçleri topla


35

Basit ama umarım önemsiz bir meydan okuma:

kSayı bölen güç veren bir program veya işlev yazın n. Daha spesifik olarak:

  • Girdi: iki pozitif tamsayı nve k(veya düzenli bir tamsayı çifti vs.)
  • Çıktı: pozitif bölenler tüm toplamı no olan ktamsayılar inci güçler

Örneğin, 11! = 39916800, 1, 8, 27, 64, 216 ve 1728 küp olmak üzere altı bölene sahiptir. Bu nedenle girdiler verilmiş 39916800ve 3program toplamlarını döndürmelidir 2044.

Diğer test durumları:

{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

Bu kod golf, kodunuz ne kadar kısaysa o kadar iyidir. Başka bir dilde sizinkinden daha az bayt bile olsa, her tür farklı dilde golf kodunu memnuniyetle karşılıyorum.


12
Mücadelenizi ilk gördüğümde, bunun Metallica şarkılarının bir başlığı olduğunu garip hissediyorum.
Arnauld,

1
Ne? Bunun için yerleşik bir Mathematica yok mu?
boboquack

Yanıtlar:


13

05AB1E , 9 bayt

DLImDŠÖÏO

Çevrimiçi deneyin!

açıklama

Örnek giriş 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 bayt

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

Adsız fonksiyon alma nve kbu sırada giriş yapma.


2
DivisorSumburada yararlı olmaya sinir bozucu derecede yakın.
ngenis,

5

Haskell , 37 35 34 bayt

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

Çevrimiçi deneyin! Kullanımı:

Prelude> 40320 ! 1
159120

Kod her zaman hesapladığı için oldukça verimsiz 1^k, 2^k, ..., n^k.

Düzenleme: Zgarb sayesinde bir bayt kaydedildi.

Açıklama:

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)olabilir n`mod`x^k.
Zgarb

5

Python 2, 54 52 bayt

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

2 bayt ayırdığınız için teşekkürler @Rod.


Sen yerini alabilir x%i**n==0ile x%i**n<1ve diğer tarafa hareketi**n*(x%i**n<1)
Rod

4

Ruby, 45 bayt

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

Ruby 2.4'te "sum" kullanarak daha kısa olurdu. Yükseltme zamanı geldi mi?


4
Yükseltme zamanı.
Yytsi

4

MATL , 10 bayt

t:i^\~5M*s

Çevrimiçi deneyin!

Nasıl çalışır

Örnek ile 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

Jöle , 7 6 bayt

-1 Dennis bayt teşekkürler (örtük bir yelpazede çapraz)
Akıllı bir verimlilik tasarrufu da en Dennis tarafından 0 bayt maliyet
(Daha önce ÆDf*€Sbir güç olan bu bölenler tutmak filtreleme yaparsınız k için herhangi bir doğal sayı yukarı n . Ama senedin o n kutu sadece hiç bir bölen var i k o bir böleni varsa i zaten!)

ÆDf*¥S

Çevrimiçi deneyin!

Nasıl?

Æ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 bayt

Alır nve ksözdizimi currying içinde (n)(k).

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

Test durumları


3

Perl 6 , 39 bayt

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

Nasıl çalışır

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

Dene


2

Japt , 10 bayt

@ETHproductions sayesinde çok fazla sayıda bayt kaydedildi

òpV f!vU x

açıklama

ò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

Çevrimiçi test edin!


vUAlgılama ile bölünebilen sayıları mı Uyoksa bölünen sayıları mı algılar U?
Greg Martin,

@GregMartin fvU, tarafından bölünebilen öğelere filtre uygular U; tarafından bölünebilen f!vUöğelere filtre Uuygular. !argümanları değiştirir.
Oliver,

Harika, kod doğru görünüyor, ancak açıklamanın ince ayarlanması gerekebilir.
Greg Martin,

@GregMartin Şimdi daha net olmalı.
ETHProductions

2

Scala 63 bayt

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


2

JavaScript (ES7), 49 46 bayt

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

Tekrarlamadığınız için, neden olmasın n=>k=>? +1.
Yytsi

@TuukkaX Daha iyi bir şeyle geldim. (Aslında bunu daha önce ibir yerel olarak aldım , 4 ekstra bayta i
Neil

1

PHP, 86 bayt

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

Burada dene!

Yıkmak :

$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!)

golf oynadı, ancak test edilmedi: for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;59 bayt; PHP 5.6 veya üstü gerektirir.
Titus



1

Bash + Unix yardımcı programları, 44 bayt

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

Çevrimiçi deneyin!

Test çalıştırması:

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 bayt

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

Çevrimiçi deneyin!

Yeterince açıksözlü. Kayda değer olan tek şey, j**k**-1%1her zaman [0 , 1 ] 'da bir kayan nokta döndürürken , n%jher zaman negatif olmayan bir tamsayı döndürür, bu nedenle her ikisi de 0 ise eşit olabilir .


1

Toplu iş, 138 bayt

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

Batch’in bir güç operatörü olmadığından, set/abir çeşit kötüye kullanıyorum eval. Ne zaman çok yavaş k=1. 32-bit tamsayı aritmetiği nve 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 bayt doğrudan, işlev için 43 bayt

bellekte n, k ise:

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

bir işlev için:

r=function(n,k)sum((n%%(1:n)^k==0)*(1:n)^k)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.