힘을 합치십시오


35

간단하지만 희망적이지는 않은 간단한 도전 :

k숫자를 나누는 위력 을 더하는 프로그램이나 함수를 작성하십시오 n. 더 구체적으로:

  • 입력 : 2 개의 양의 정수 nk(또는 정렬 된 정수 쌍 등)
  • 출력 :의 양의 약수의 모든의 합 n이는 k정수의 일 힘

예를 들어 11! = 39916800에는 6 개의 제수, 즉 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
내가 당신의 도전을 처음 보았을 때, 나는 그것이 메탈리카 노래 제목이라는 이상한 느낌을 받았습니다.
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

수학, 28 바이트

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

이름 기능을 복용 n하고 k순서대로 입력으로.


2
DivisorSum여기서 유용하게 사용되는 것은 매우 실망 스럽습니다.
ngenisis 2012

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입니다.

편집 : Zgarb 덕분에 1 바이트를 절약했습니다.

설명:

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

파이썬 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)
Rod

4

루비, 45 바이트

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

Ruby 2.4에서 "sum"을 사용하면 더 짧을 것입니다. 업그레이드 할 시간?


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 바이트

Dennis 덕분에 -1 바이트 (암시 적 범위 통과) 0 바이트 비용 으로 Dennis
영리한 효율성을 절약 할 수 있습니다 (이전에는 자연수 k 의 거듭 제곱 인 n을 최대 n 까지 필터링 할 수 있습니다 . 그러나 n 은 오직의 제수가 케이 는의 약수가있는 경우 난을 어쨌든!)
ÆDf*€S

Æ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

자바 스크립트 (ES7), 56 53 바이트

소요 nk구문을 무두질에서 (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

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?
Greg Martin

@GregMartin fvU은 다음과 같이 나눌 수있는 항목으로 필터링합니다 U. 나눌 수있는 f!vU항목으로 필터링합니다 U. !인수를 바꿉니다.
Oliver

멋지므로 코드가 올바르게 보이지만 설명을 조정해야 할 수도 있습니다.
Greg Martin

@GregMartin 더 명확 해져야합니다.
ETHproductions

2

스칼라 63 바이트

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


2

자바 스크립트 (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 나는 더 나은 것을 생각해 냈습니다. (실제로 이것을 i4 바이트의 추가 비용이 드는 로컬로 이전에 가지고 있었고 , 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 이상이 필요합니다.
Titus



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

파이썬 , 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) 에서 float를 반환하는 반면 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%

Batch에는 전력 연산자가 없으므로 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.