Quanti quadrati, cubi, quarte potenze, ecc. Devo sommare a n?


14

Ti viene dato un numero intero non negativo ne un numero intero p >= 2. È necessario aggiungere un po 'di ppoteri ( p=2significa quadrati, p=3significa cubi) insieme per ottenere n. Questo è sempre per qualsiasi non negativo n, ma non conosci molti ppoteri (di qualsiasi numero intero positivo ) di cui avrai bisogno.

Questo è il tuo compito: trova il numero minimo di ppotenze che possono essere sommate n.

Esempi

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

Un articolo di Wikipedia su questo problema, il problema di Waring .

Regole

  • Il tuo codice deve essere un programma o una funzione.

  • L'input è di due numeri interi ne pin qualsiasi ordine. Puoi presumere che tutti gli input siano validi ( nè un numero intero positivo,p >= 2

  • L'output è un numero intero che rappresenta il numero di potenze necessarie per sommare n.

  • Questo è il golf del codice, quindi vince il programma più breve , non necessariamente il più efficiente.

  • Sono consentiti tutti gli incorporamenti.

Come sempre, se il problema non è chiaro, per favore fatemi sapere. Buona fortuna e buon golf!


Bene, sembra che la forza bruta vincerà. Spero di no.
lirtosiast,

3
Questo problema è incredibilmente difficile e dubito che qualsiasi risposta finirà mai dando risultati corretti.
orlp,

Almeno hanno limiti superiori
qwr

Risposte:


5

Pyth, 20 19 byte

Salvato 1 byte grazie a FryAmTheEggman.

L&bhSmhy-b^dQS@bQyE

Accetta input su due righe, pprima e poi n.

Provalo online. Suite di test.

Spiegazione

Il codice definisce una funzione ricorsiva y(b)che restituisce il risultato per 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 byte

Con 11 byte salvati da LegionMammal978.

Se limitato ai poteri di conteggio dei numeri, questo problema è semplice (in Mathematica). Se esteso per includere poteri di numeri interi, è un incubo.

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

Casi test

(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]trova tutti i casi in cui npuò essere espresso come somma di knumeri interi positivi portati pall'ennesima potenza.


Per esempio,

PowersRepresentations[1729, 2, 3]

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

Controllo,

1^3 + 12^3

1729


9^3 + 10^3

1729


Linguaggi competitivi come Mathematica sconfiggono lo scopo di queste cose ... non ci vuole creatività per conoscere un nome di funzione. Ma comunque, ben scritto.
csga5000,

1
@ csga5000 Ehi, le lingue del golf vincono il 99% delle sfide in questo sito ...
LegionMammal978,

@ LegionMammal978 Anche se non sono d'accordo con il punto csga, giocare a golf nelle lingue del golf richiede un'enorme quantità di creatività.
Maniglia della porta

2
D'accordo, nessun premio per la creatività su questo argomento. Né per compattezza: l'invio di Pyth è inferiore alla metà della lunghezza. I problemi diventano difficili per linguaggi come Mathematica quando possono essere rifusi come esempi di fenomeni più generali e quando combinazioni insolite di funzioni di alto livello possono svolgere un ruolo. Inoltre diventano più interessanti.
DavidC,

3

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

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

Risultato

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

Questa risposta non è valida p(32,2)ritorna 5quando dovrebbe return 2( 4^2 + 4^2 = 32).
PurkkaKoodari,

@ Pietu1998 Ok lo modificherò.
Yassin Hajaj,

@ Pietu1998 Come lo faresti?
Yassin Hajaj,

L'ho fatto in modo ricorsivo, controllando ogni possibile potenza per ogni numero.
PurkkaKoodari,

1
@YassinHajaj +1 per java e fai da te
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)

Prova in modo ricorsivo a sottrarre ogni ppotenza ottava che lascia il resto non negativo, calcolando il suo valore su ciascun resto e prendendo il minimo più 1. Su 0, genera 0.

Il brutto controllo if n/k**p(equivalente a if k**p<=n) è quello di impedire alla funzione di entrare nei negativi e cercare di prendere la minlista vuota. Se Python ha min([])=infinity, questo non sarebbe necessario.


Wow. Questo è molto più breve del mio codice di test su Python. +1!
Sherlock9,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.