n에 합산해야하는 사각형, 큐브, 4 제곱 등은 몇 개입니까?


14

음이 아닌 정수 n와 정수가 제공 p >= 2됩니다. 를 얻으려면 몇 p번째 거듭 제곱 ( p=2제곱, p=3큐브)을 더해야 n합니다. 이것은 항상 음이 아닌 모든 것을위한 n것이지만 필요한 양의 정수 p의 많은 제곱을 알지 못합니다 .

이것은 당신의 임무입니다 :에 p합할 수있는 최소 제곱의 수를 찾으십시오 n.

>>> min_powers(7, 2)
4                       # you need at least four squares to add to 7
                        # Example: (2)^2 + (1)^2 + (1)^2 + (1)^2 = 4 + 1 + 1 + 1 = 7
>>> min_powers(4, 2)
1                       # you need at least one square to add to 4
                        # Example: (2)^2 = 4
>>> min_powers(7, 3)
7                       # you need at least seven cubes to add to 7
                        # Example: 7*(1)^3 = 7
>>> min_powers(23, 3)
9                       # you need at least nine cubes to add to 23
                        # Example: 2*(2)^3 + 7*(1)^2 = 2*8 + 7*1 = 23

이 문제에 관한 Wikipedia 관련 기사, Waring 's problem .

규칙

  • 코드 프로그램 또는 함수 여야합니다 .

  • 입력은 2 개의 정수 n이며 p순서에 관계없이 입력됩니다 . 모든 입력이 유효하다고 가정 할 수 있습니다 ( n양의 정수,p >= 2

  • 출력은에 필요한 전력의 수를 나타내는 정수 n입니다.

  • 이것은 코드 골프이므로 가장 짧은 프로그램이 승리합니다. 반드시 가장 효율적인 것은 아닙니다.

  • 모든 내장 기능이 허용됩니다.

문제가 명확하지 않은 경우 언제든지 알려주십시오. 행운과 좋은 골프!


글쎄, 그것은 무차별적인 힘이 이길 것 같습니다. 그래도 아니길 바랍니다.
lirtosiast

3
이 문제는 엄청나게 어려우며 올바른 결과를 제공하는 동안 어떤 대답도 끝나지 않을 것입니다.
orlp

최소 상한선
qwr

답변:


5

Pyth, 20 19 바이트

저장된 1 개 바이트 FryAmTheEggman 덕분에.

L&bhSmhy-b^dQS@bQyE

두 줄을 p먼저 입력 한 다음 입력합니다 n.

온라인으로 사용해보십시오. 테스트 스위트.

설명

이 코드는 y(b)의 결과를 반환 하는 재귀 함수 를 정의합니다 min_powers(b, p).

L                      define a function y(b):
 &b                      return b if it's 0
             S           get a list of positive integers less than or equal to
              @bQ        the p:th root of b
     m                   map the integers to:
        -b                 subtract from b
          ^dQ              the p:th power of the current integer
       y                   recurse on the above
      h                    increment the result
    hS                   find the smallest result number and return it
                 yE    calculate y(n) and print

8

Mathematica 61 50 바이트

LegionMammal978에 의해 11 바이트가 절약됩니다.

숫자를 세는 수로 제한하면이 문제는 간단합니다 (Mathematica에서). 정수의 거듭 제곱을 포함하도록 확장하면 악몽입니다.

(k=0;While[PowersRepresentations[#,++k,#2]=={}];k)&

테스트 사례

(k = 0; While[PowersRepresentations[#, ++k, #2] == {}]; k) &[7, 2]
(k = 0; While[PowersRepresentations[#, ++k, #2] == {}]; k) &[4, 2]
(k = 0; While[PowersRepresentations[#, ++k, #2] == {}]; k) &[7, 3]
(k = 0; While[PowersRepresentations[#, ++k, #2] == {}]; k) &[23, 3]

4

1

7

9


PowersRepresentationsp[n,k,p]- 제곱으로 올린 양의 정수 n의 합으로 표현할 수있는 모든 경우를 찾습니다 .kp


예를 들어

PowersRepresentations[1729, 2, 3]

{{1, 12}, {9, 10}}

확인 중,

1^3 + 12^3

1729


9^3 + 10^3

1729


Mathematica와 같은 경쟁적인 언어는 이러한 것들의 목적을 무너 뜨립니다 ... 함수 이름을 아는 데는 창의성이 필요하지 않습니다. 그러나 여전히 잘 작성되었습니다.
csga5000

1
@ csga5000 이봐, 골프 언어는이 사이트에서 도전 과제의 99 %를 승리 ...
LegionMammal978

@ LegionMammal978 csga의 의견에 동의하지 않지만 골프 언어로 골프를 즐기려면 엄청난 창의력이 필요합니다 .
Doorknob

2
이 제출물에 대한 창의성에 대한 수상은 없습니다. 압축성도 : Pyth 제출은 길이의 절반 미만입니다. Mathematica와 같은 언어는 좀 더 일반적인 현상의 사례로 재구성 될 수 있고 특이한 수준의 기능 조합이 역할을 수행 할 수있을 때 문제가됩니다. 그들은 또한 더 흥미로워집니다.
DavidC

3

자바 -183 177 바이트

int p(int a,int b){int P,c,t,l=P=t=a,f=0;double p;while(P>0){a=t=l;c=0;while(t>0){if(a-(p=Math.pow(t,b))>=0&&t<=P){while((a-=p)>=0)c++;a+=p;}t--;}f=c<f||f==0?c:f;P--;}return f;}

183 바이트

int p(int a,int b){int P,c,t,l,f=0;P=t=l=a;double p;while(P>0){a=t=l;c=0;while(t>0){if(a-(p=Math.pow(t,b))>=0&&t<=P){while((a-=p)>=0){c++;}a+=p;}t--;}f=c<f||f==0?c:f;P--;}return f;}

언 골프

int p(int a, int b){
    int P,c,t,l=P=t=a,f=0;
    double p;
    while (P>0){
        a=t=l;
        c=0;
        while (t>0){
            if (a-(p=Math.pow(t, b))>=0 && t<=P){
                while((a-=p)>=0)c++;
                a+=p;
            }
            t--;
        }
        f=c<f||f==0?c:f;
        P--;
    }
    return f;
}

결과

System.out.println(p(7, 2));    // 4
System.out.println(p(4,2));     // 1
System.out.println(p(7,3));     // 7
System.out.println(p(23,3));    // 9

이 답변은 유효하지 않습니다. ( )를 반환해야 할 때 p(32,2)반환합니다 . 524^2 + 4^2 = 32
PurkkaKoodari

@ Pietu1998 자 수정하겠습니다.
Yassin Hajaj

@ Pietu1998 어떻게 하시겠습니까?
Yassin Hajaj

나는 매번 가능한 모든 힘을 확인하면서 재귀 적으로 수행했습니다.
PurkkaKoodari

1
자바에 대한 @YassinHajaj +1 및 직접 수행
csga5000

1

파이썬 2, 66 바이트

f=lambda n,p:n and-~min(f(n-k**p,p)for k in range(1,n+1)if n/k**p)

재귀 적으로 각 p제곱 거듭 제곱을 빼서 나머지를 음이 아닌 것으로 남겨두고, 나머지에 대한 값을 계산하고, 최소 더하기 1을 취합니다. 0에서 0을 출력합니다.

추악한 검사 if n/k**p(와 동일 if k**p<=n)는 함수가 부정으로 들어가고 min빈 목록 을 가져 오는 것을 막는 것 입니다. 파이썬이 min([])=infinity이면 필요하지 않습니다.


와. 이것은 파이썬의 테스트 코드보다 훨씬 짧습니다. +1!
Sherlock9

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.