Скільки квадратів, кубів, четвертих степенів і т. Д. Мені потрібно підсумовувати до n?


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

Відповідна стаття у Вікіпедії щодо цієї проблеми, проблема Варінга .

Правила

  • Ваш код повинен бути програмою або функцією.

  • Вхід - два цілі числа 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 байт

З 11 байтами, збереженими LegionMammal978.

Якщо обмежується повноваженнями підрахунку чисел, ця проблема є прямолінійною (в 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можна виразити суму kпозитивних цілих чисел, піднятих до p-ої сили.


Наприклад,

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, для гольфу в гольфних мовах потрібна величезна творчість.
Дверна ручка

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коли він повинен повернутися 2( 4^2 + 4^2 = 32).
PurkkaKoodari

@ Pietu1998 Добре, я його зміню.
Яссін Хаджай

@ Pietu1998 Як би ти це зробив?
Яссін Хаджай

Я робив це рекурсивно, перевіряючи кожну можливу потужність для кожного числа.
PurkkaKoodari

1
@YassinHajaj +1 для java та робити це самостійно
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!
Шерлок9

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.