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の問題

ルール

  • コードプログラムまたは関数でなければなりません

  • 入力は二つの整数であるnp任意の順序で。すべての入力が有効であると仮定できます(n正の整数、p >= 2

  • 出力は、合計するのに必要な累乗の数を表す整数nです。

  • これはコードゴルフなので、最短のプログラムが勝ちます。必ずしも最も効率的ではありません。

  • すべてのビルトインが許可されます。

いつものように、問題が不明な場合はお知らせください。幸運と良いゴルフ!


まあ、それはブルートフォースが勝つように見えます。そうではないことを願っています。
リルトシアスト

3
この問題は信じられないほど難しいものであり、正しい結果を出しながら回答が終わることはないと思います。
orlp

少なくとも上限持っている
QWR

回答:


5

Pyth、20 19バイト

FryAmTheEggmanのおかげで1バイト節約されました。

L&bhSmhy-b^dQS@bQyE

p最初に2行で入力を取得し、次に入力し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

私はcsgaのポイントに同意しませんが、@ LegionMammal978、ゴルフの言語でダウン物事をゴルフすることは必要で巨大な創造力の量を。
ドアノブ

2
同意しました。この投稿に関する創造性に対する賞はありません。また、コンパクトさのために:Pyth提出は長さの半分未満です。Mathematicaなどの言語では、より一般的な現象のインスタンスとして再キャストできる場合や、高レベル関数の異常な組み合わせが役割を果たす可能性がある場合、問題は困難になります。また、より興味深いものになります。
DavidC

3

Java- 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)戻る5べきとき24^2 + 4^2 = 32)に戻ります。
PurkkaKoodari

@ Pietu1998はい、修正します。
ヤシンハジャイ

@ Pietu1998どうしますか?
ヤシンハジャジ

私はそれを再帰的に行い、すべての数字の各可能な力をチェックしました。
PurkkaKoodari

1
@YassinHajaj javaの+1とそれを自分で行う
csga5000

1

Python 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、空のリストを取得しようとするのを止めることです。Pythonにがある場合min([])=infinity、これは必要ありません。


ワオ。これは、Pythonでのテストコードよりもはるかに短いです。+1!
Sherlock9

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.