Berapa banyak kotak, kubus, kekuatan keempat, dll yang harus saya hitung menjadi n?

14

Anda diberi bilangan bulat negatif ndan bilangan bulat p >= 2. Anda perlu menambahkan beberapa pkekuatan-ke-dua ( p=2artinya kuadrat, p=3artinya kubus) untuk mendapatkan n. Ini selalu untuk non-negatif n, tetapi Anda tidak tahu banyak pkekuatan-ke-10 (dari bilangan bulat positif ) apa pun yang Anda perlukan.

Ini adalah tugas Anda: cari jumlah minimum pkekuatan -th yang bisa dijumlahkan n.

Contohnya

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

Artikel Wikipedia terkait tentang masalah ini, masalah Waring .

Aturan

  • Kode Anda harus berupa program atau fungsi.

  • Input adalah dua bilangan bulat ndan pdalam urutan apa pun. Anda dapat menganggap semua input valid ( napakah bilangan bulat positif,p >= 2

  • Output adalah bilangan bulat yang mewakili jumlah daya yang dibutuhkan untuk dijumlahkan n.

  • Ini adalah kode golf, sehingga program terpendek menang., Belum tentu yang paling efisien.

  • Setiap dan semua bawaan diizinkan.

Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!

Sherlock9
sumber
Yah, sepertinya brute force akan menang. Saya harap tidak.
lirtosiast
3
Masalah ini sangat sulit, dan saya ragu bahwa jawaban apa pun akan selesai saat memberikan hasil yang benar.
orlp
Setidaknya memiliki batas atas
qwr

Jawaban:

5

Pyth, 20 19 byte

Disimpan 1 byte berkat FryAmTheEggman.

L&bhSmhy-b^dQS@bQyE

Mengambil input pada dua baris, ppertama dan kemudian n.

Cobalah online. Suite uji.

Penjelasan

Kode mendefinisikan fungsi rekursif y(b)yang mengembalikan hasilnya 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
PurkkaKoodari
sumber
8

Mathematica 61 50 byte

Dengan 11 byte yang disimpan oleh LegionMammal978.

Ketika terbatas pada kekuatan menghitung angka, masalah ini sangat mudah (dalam Mathematica). Ketika diperluas untuk memasukkan kekuatan bilangan bulat, itu adalah mimpi buruk.

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

Uji Kasus

(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]menemukan semua kasus di mana ndapat dinyatakan sebagai jumlah kbilangan bulat positif dinaikkan ke-the ppower.


Sebagai contoh,

PowersRepresentations[1729, 2, 3]

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

Memeriksa,

1^3 + 12^3

1729


9^3 + 10^3

1729

DavidC
sumber
Bahasa kompetitif seperti Mathematica mengalahkan tujuan dari hal-hal ini ... tidak diperlukan kreativitas untuk mengetahui nama fungsi. Tapi tetap saja, ditulis dengan baik.
csga5000
1
@ csga5000 Hai, bahasa golf memenangkan 99% tantangan di situs ini ...
LegionMammal978
@ LegionMammal978 Walaupun saya tidak setuju dengan poin csga, bermain golf dalam bahasa golf membutuhkan kreativitas yang sangat besar .
Gagang Pintu
2
Setuju, tidak ada penghargaan untuk kreativitas pada pengiriman ini. Atau untuk kekompakan: pengiriman Pyth kurang dari setengah panjangnya. Masalah menjadi tantangan untuk bahasa seperti Mathematica ketika mereka dapat disusun kembali sebagai contoh fenomena yang lebih umum dan ketika kombinasi fungsi tingkat tinggi yang tidak biasa dapat memainkan peran. Mereka juga menjadi lebih menarik.
DavidC
3

Jawa - 183 177 byte

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 byte

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;}

Tidak disatukan

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;
}

Hasil

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
Yassin Hajaj
sumber
Jawaban ini tidak valid. p(32,2)kembali 5ketika seharusnya kembali 2( 4^2 + 4^2 = 32).
PurkkaKoodari
@ Pietu1998 Oke saya akan memodifikasinya.
Yassin Hajaj
@ Pietu1998 Bagaimana kamu melakukannya?
Yassin Hajaj
Saya melakukannya secara rekursif, memeriksa setiap kekuatan yang mungkin untuk setiap nomor.
PurkkaKoodari
1
@YassinHajaj +1 untuk java dan melakukannya sendiri
csga5000
1

Python 2, 66 byte

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

Secara rekursif mencoba mengurangi masing-masing pkekuatan-yang membuat sisanya non-negatif, menghitung nilainya pada setiap sisa, dan mengambil minimum plus 1. Pada 0, output 0.

Cek jelek if n/k**p(setara dengan if k**p<=n) adalah untuk menghentikan fungsi dari masuk ke negatif dan mencoba untuk mengambil mindari daftar kosong. Jika Python memilikinya min([])=infinity, ini tidak diperlukan.

Tidak
sumber
Wow. Ini jauh lebih pendek daripada kode pengujian saya di Python. +1!
Sherlock9
0

C (gcc) , 122 byte

r(n,p,k,s,j,b){if(!k)return n!=s;for(b=j=1;j<n;b*=r(n,p,~-k,s+(int)pow(j++,p)));n=b;}f(n,p,k){for(k=0;r(n,p,++k,0););n=k;}

Cobalah online!

Jonathan Frech
sumber