รวมพลังที่จะ


35

ความท้าทายที่เรียบง่าย แต่ไม่หวังว่าจะเป็นเรื่องเล็กน้อย:

เขียนโปรแกรมหรือฟังก์ชั่นที่เพิ่มขึ้นkอำนาจ TH nหารตัวเลข โดยเฉพาะอย่างยิ่ง:

  • อินพุต: จำนวนเต็มบวกสองค่าnและk(หรือคู่จำนวนเต็มสั่งซื้อ)
  • เอาท์พุท: ผลรวมของตัวหารnที่เป็นบวกทั้งหมดนั่นคือkพลังของจำนวนเต็ม

ตัวอย่างเช่น 11! = 39916800 มีหกตัวหารที่มีก้อนคือ 1, 8, 27, 64, 216, และ 1728. ปัจจัยการผลิตที่กำหนดดังนั้น39916800และโปรแกรมที่ควรกลับผลรวมของพวกเขา32044

กรณีทดสอบอื่น ๆ :

{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

นี่คือรหัสกอล์ฟดังนั้นยิ่งรหัสของคุณสั้นเท่าไหร่ก็ยิ่งดีเท่านั้น ฉันยินดีต้อนรับรหัส golfed ในทุกภาษาที่แตกต่างกันแม้ว่าภาษาอื่น ๆ บางอย่างสามารถไปด้วยไบต์น้อยกว่าของคุณ


12
เมื่อฉันเห็นการท้าทายของคุณครั้งแรกฉันรู้สึกแปลก ๆ ว่ามันเป็นชื่อเพลง Metallica
Arnauld

1
อะไร? ไม่มี Mathematica ในตัวสำหรับสิ่งนี้หรือไม่
boboquack

คำตอบ:


13

05AB1E , 9 ไบต์

DLImDŠÖÏO

ลองออนไลน์!

คำอธิบาย

ตัวอย่างอินพุต 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 ไบต์

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

ฟังก์ชั่นไม่มีชื่อnและkเป็นปัจจัยการผลิตในลำดับที่


2
DivisorSumใกล้จะมีประโยชน์ที่นี่อย่างน่าผิดหวัง
ngenisis

5

Haskell , 37 35 34 ไบต์

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

ลองออนไลน์! การใช้งาน:

Prelude> 40320 ! 1
159120

1^k, 2^k, ..., n^kรหัสจะไม่มีประสิทธิภาพมากเพราะมันก็คำนวณ

แก้ไข:บันทึกหนึ่งไบต์ขอบคุณ Zgarb

คำอธิบาย:

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)n`mod`x^kสามารถ
Zgarb

5

Python 2, 54 52 ไบต์

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

ขอบคุณ @Rod สำหรับการตัด 2 ไบต์


คุณสามารถแทนที่x%i**n==0ด้วยx%i**n<1และย้ายไปยังอีกด้านหนึ่งได้เช่นi**n*(x%i**n<1)
Rod

4

Ruby ขนาด 45 ไบต์

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

จะสั้นลงโดยใช้ "ผลรวม" ใน Ruby 2.4 ถึงเวลาอัพเกรดแล้ว


4
ใช้เวลาในการอัพเกรด
Yytsi

4

MATL 10 ไบต์

t:i^\~5M*s

ลองออนไลน์!

มันทำงานอย่างไร

ตัวอย่างด้วย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

เยลลี่ , 7 6 ไบต์

-1 ขอบคุณไบต์เดนนิส (สำรวจช่วงนัย)
ประสิทธิภาพฉลาดประหยัดยังโดยเดนนิสที่ค่าใช้จ่าย 0 ไบต์
(ก่อนหน้านี้ÆDf*€Sจะกรองให้หารผู้ที่มีอำนาจของkของจำนวนธรรมชาติใด ๆ ถึงn . แต่ทราบว่าnสามารถ เคยมีตัวหารของi k เท่านั้นหากมีตัวหารของiต่อไป!)

ÆDf*¥S

ลองออนไลน์!

อย่างไร?

Æ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 ไบต์

ใช้เวลาnและในไวยากรณ์ความดีความชอบk(n)(k)

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

กรณีทดสอบ


3

Perl 6 , 39 ไบต์

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

มันทำงานอย่างไร

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

ลองมัน


2

Japt , 10 ไบต์

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณ @ETHproductions

òpV f!vU x

คำอธิบาย

ò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

ทดสอบออนไลน์!


ไม่vUตรวจสอบหมายเลขหารด้วยUหรือตัวเลขที่หารU?
เกร็กมาร์ติน

@GregMartin fvUกรองรายการที่หารด้วยU; f!vUตัวกรองไปยังรายการที่Uหารด้วย !สลับค่าอาร์กิวเมนต์
โอลิเวอร์

เยี่ยมมากรหัสนั้นดูถูกต้อง แต่คำอธิบายอาจจะต้องมีการปรับแต่ง
เกร็กมาร์ติน

@ GregMartin น่าจะชัดเจนขึ้นแล้ว
ETHproductions



2

JavaScript (ES7), 49 46 ไบต์

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

เมื่อคุณไม่กลับมาทำงานอีกทำไมn=>k=>ล่ะ +1
Yytsi

@ TuukkaX ฉันมาด้วยสิ่งที่ดีกว่า (จริง ๆ แล้วฉันเคยเป็นแบบนี้มาก่อนiซึ่งมีค่าใช้จ่ายเพิ่มขึ้น 4 ไบต์และลืมไปว่าฉันสามารถใช้iวิธีการเดียวกับที่ฉันทำกับสูตรอื่น ๆ )
Neil

1

PHP, 86 ไบต์

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

ลองที่นี่!

ทำให้พังถล่ม :

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

ตีกอล์ฟ แต่ไม่ได้ทดสอบ: for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;59 ไบต์; ต้องการ PHP 5.6 หรือใหม่กว่า
ติตัส



1

ยูทิลิตีBash + Unix ขนาด 44 ไบต์

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

ลองออนไลน์!

ทดสอบการทำงาน:

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 ไบต์

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

ลองออนไลน์!

ค่อนข้างตรงไปตรงมา สิ่งเดียวที่น่าสังเกตก็คือว่าj**k**-1%1เสมอกลับลอยใน[0,1)ขณะที่n%jเสมอกลับจำนวนเต็มไม่เป็นลบดังนั้นพวกเขาจะไม่สามารถที่เท่าเทียมกันถ้าทั้งสองเป็น0


1

แบตช์ 138 ไบต์

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

เนื่องจากแบทช์ไม่มีผู้ให้บริการด้านพลังงานฉันจึงใช้set/aรูปแบบที่evalไม่เหมาะสม k=1ช้ามากเมื่อ เลขคณิตจำนวนเต็ม 32 บิต จำกัด ค่าที่สนับสนุนของnและ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 ไบต์โดยตรง, 43 ไบต์สำหรับฟังก์ชัน

ถ้า n, k ในหน่วยความจำ:

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

สำหรับฟังก์ชั่น:

r=function(n,k)sum((n%%(1:n)^k==0)*(1:n)^k)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.