जो शक्तियाँ हैं


35

एक सरल लेकिन उम्मीद है कि बहुत मामूली चुनौती नहीं:

एक प्रोग्राम या फ़ंक्शन लिखें जो kकिसी संख्या को विभाजित करने वाली वें शक्तियों को जोड़ता है n। अधिक विशेष रूप से:

  • इनपुट: दो धनात्मक पूर्णांक nऔर k(या पूर्णांकों का एक जोड़ा युग्म, आदि)
  • आउटपुट: के सकारात्मक divisors के सभी का योग nहै कि कर रहे हैं kपूर्णांक वें शक्तियों

उदाहरण के लिए, 11! = 39916800 छह divisors कि क्यूब्स, अर्थात् 1, 8, 27, 64, 216, और 1728 इसलिए दिया आदानों हैं 39916800और 3, इस कार्यक्रम उनका योग लौटना चाहिए, 2044

अन्य परीक्षण मामले:

{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

यह कोड गोल्फ है, इसलिए आपका कोड जितना छोटा होगा, उतना अच्छा होगा। मैं सभी प्रकार की विभिन्न भाषाओं में गोल्फ कोड का स्वागत करता हूं, भले ही कुछ अन्य भाषा आपकी तुलना में कम बाइट्स के साथ दूर हो सकती हैं।


12
जब मैंने पहली बार आपकी चुनौती को देखा, तो मुझे अजीब लग रहा था कि यह एक मेटालिका गीत का शीर्षक था।
अरनौलद

1
क्या? इसके लिए कोई मैथेमेटिका निर्मित नहीं है?
२०

जवाबों:


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

गणितज्ञ, 28 बाइट्स

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

उस क्रम में इनपुट लेने nऔर kइनपुट के रूप में।


2
DivisorSumनिराशा से यहाँ उपयोगी होने के करीब है।
ngenisis

5

हास्केल , 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

संपादित करें: जर्ब को धन्यवाद एक बाइट बचाया।

स्पष्टीकरण:

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
ज़गरब

5

पायथन 2, 54 52 बाइट्स

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

धन्यवाद @ बोड 2 बाइट्स काटने के लिए।


आप के x%i**n==0साथ बदल सकते हैं x%i**n<1, और दूसरी तरफ के रूप में स्थानांतरित कर सकते हैंi**n*(x%i**n<1)
रॉड

4

रूबी, 45 बाइट्स

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

रूबी 2.4 में "योग" का उपयोग करना कम होगा। उन्नयन का समय?


4
उन्नयन का समय।
यति

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उन divisors की एक शक्ति हैं रखने फ़िल्टर हो जाएंगे कश्मीर के लिए किसी भी प्राकृतिक संख्या की एन । लेकिन ध्यान दें कि एन कर सकते हैं ही कभी का एक भाजक है मैं k अगर इसके बारे में एक भाजक है मैं वैसे भी!)

Æ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

जावास्क्रिप्ट (ईएस 7), 56 53 बाइट्स

लेता है nऔर kसिंटेक्स में करीने से (n)(k)

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

परीक्षण के मामलों


3

पर्ल 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

जाप , 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

स्काला 63 बाइट्स

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


2

जावास्क्रिप्ट (ईएस 7), 49 46 बाइट्स

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

जब से तुम नहीं आ रहे हैं, क्यों नहीं n=>k=>? +1।
यति

@TuukkaX मैं कुछ बेहतर के साथ आया था। (मैं वास्तव में पहले iएक स्थानीय के रूप में था , जिसकी कीमत 4 अतिरिक्त बाइट्स थी, और यह भूल गया कि मैं iउसी तरह से दुरुपयोग कर सकता हूं जैसा मैंने अपने अन्य फॉर्मूलेशन के साथ किया था।)
नील

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

बैश + यूनिक्स उपयोगिताओं, 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

पायथन , 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

आर, 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.