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


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 .

правила

  • Ваш код должен быть программой или функцией.

  • Ввод двух целых 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

Ява - 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;}

Ungolfed

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 и
делай

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.