Soma de cinco cubos


33

Dado um número inteiro, produza cinco cubos perfeitos cuja soma é esse número inteiro. Observe que os cubos podem ser positivos, negativos ou zero. Por exemplo,

-10 == -64 - 64 + 64 + 27 + 27

portanto, para entrada, -10você pode produzir [-64, -64, 64, 27, 27], embora outras soluções sejam possíveis. Observe que você deve gerar os cubos, não os números que estão sendo cubados.

Uma solução Sempre existe - você pode descobrir isso por si mesmo. É ainda conjeturado que quatro cubos são suficientes.


Duas perguntas: podemos produzir algum resultado, ou apenas o menor? Para -10outra solução possível poderia ser, -1000+4574296+4410944-4492125-4492125por exemplo. E é permitido produzir --ou em +-vez de +/ -respectivamente (ou seja, em 3 = 27+-27+-125--64--64vez de 3 = 27-27-135+64+64)?
Kevin Cruijssen

@KevinCruijssen Qualquer resultado é bom. Se você quer dizer saída como --5, eu diria que não, conforme as regras usuais de saída de uma expressão .
Xnor

@KevinCruijssen Você não precisa gerar uma expressão com +sinais, apenas os números.
Xnor

-10 = -64 - 64 + 64 + 27 + 27ou-10 = -343 + 0 -8 +125 +216
Angs 04/04/19

3
Nota interessante: 3 não é suficiente (alguns números não são representáveis), mas existem alguns cuja representação é desconhecida (como 33).
Esolanging Fruit

Respostas:


16

Braquilog , 18 bytes

∧5~lLȧᵐ≥₁∧L^₃ᵐ.+?∧

Experimente online!

Explicação

Basicamente, descrevemos o problema, com a restrição adicional de que queremos que a lista de saída não aumente em termos de magnitudes: isso força o Brachylog a retroceder adequadamente em todas as combinações possíveis de 5 valores, em vez de retroceder infinitamente no valor do último elemento da lista.

∧                ∧    (disable some implicit stuff)
 5~lL                 L is a list of length 5
    Lȧᵐ≥₁             L must be a non-increasing list in terms of magnitude
         ∧
          L^₃ᵐ.       The output is L with each element cubed
              .+?     The sum of the output is the input

Encontrando soluções diferentes

Ao anexar a , é possível usar esse predicado para encontrar todas as soluções com magnitudes crescentes: por exemplo, aqui estão as 10 primeiras soluções para42


14

Brachylog , 11 bytes

Obrigado Fatalize por economizar um byte

~+l₅≥₁.√₃ᵐ∧

Experimente online!

Em primeiro lugar, ~+reforça que a saída ( .) deve somar a entrada. l₅restringe novamente a saída, ditando que ela deve ter um comprimento de 5.≥₁ declara que a lista deve estar em ordem decrescente (acredito que isso seja necessário para impedir que o programa entre em um loop infinito)

Unificamos explicitamente essa lista com .a variável de saída, porque nosso próximo predicado "alterará" os valores dentro da lista. Em seguida, pegamos a raiz do cubo de cada valor na lista com√₃ᵐ . Como o Brachylog é inerentemente baseado em números inteiros, isso determina que todos os números na lista são números de cubos.

Finalmente, usamos porque há um implícito .adicionado ao final de cada linha. Como não queremos .ser unificados com a lista de raízes de cubos, unificamos-a mais cedo e usamos para interromper a unificação no final.


10

Python 2 , 58 57 54 bytes

def f(n):k=(n**3-n)/6;return[v**3for v in~k,1-k,n,k,k]

Experimente online!


  • -2 bytes, graças a Rod
  • -1 byte, graças a Neil

1
Você pode salvar 2 bytes trocando o sinalk=-(n-n**3)/6;[v**3for v in~k,1-k,n,k,k]
Rod

1
@ Rod Para -(n-n**3)você não pode usar (n**3-n)?
419 Neil

@ Neil sim, você pode.
Haste


7

Java 8, 178 87 73 71 65 bytes

n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}

-6 bytes graças a @ OlivierGrégoire .

A mesma explicação na parte inferior, mas usando a equação base em vez da derivada que eu usei antes (graças à resposta Python 3 de @LeakyNun para a dica implícita):

k = (n - n 3 ) / 6
n == n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3

Experimente online.


Resposta antiga de 178 bytes:

n->{for(long k=0,a,b,c,d;;){if(n==(a=n*n*n)+(b=(d=k+1)*d*d)+(c=(d=k-1)*d*d)-(d=k*k*k++)-d)return a+","+b+","+c+","+-d+","+-d;if(n==a-b-c+d+d)return-a+","+-b+","+-c+","+d+","+d;}}

Experimente online.

Explicação:

Faço um loop kde 0 para cima até encontrar uma solução. Em cada iteração, ele verificará essas duas equações:

  • Positivo k: n == n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3
  • Negativo k: n == n 3 - (k + 1) 3 - (k-1) 3 + k 3 + k 3

Por quê?

Como n - n 3 = n * (1-n) * (1 + n) e, em seguida, 6 | (nn 3 ) , ele pode ser escrito como n - n 3 = 6k .
6k = (k + 1) 3 + (k-1) 3 - k 3 - k 3 .
E, portanto, n = n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3 para alguns k .
Fonte.


1
65 bytes : n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}(ou 64 usando ints para resultados menos precisos)
Olivier Grégoire

6

Gelatina , 13 bytes

‘c3µ;;C;~;³*3

Experimente online!

Descobrir a fórmula de forma independente. (x + 1) 3 + (x-1) 3 - 2 × x 3 == 6 × x.


 === Explanation ===
‘c3µ;;C;~;³*3   Main link. Input: (n).
‘               Increment.
 c3             Calculate (n+1)C3 = (n+1)×n×(n-1)÷6.
   µ            Start a new monadic link. Current value: (k=(n³-n)÷6)
    ;           Concatenate with itself.
     ;C         Concatenate with (1-k).
       ;~       Concatenate with bitwise negation of (k), that is (-1-k)
         ;³     Concatenate with the input (n).
           *3   Raise the list [k,k,1-k,-1-k,n] to third power.
                End of program, implicit print.

Alternativa 13 bytes: Experimente online!


‘c3µ³;;;C;~*3deve salvar um byte uma vez que (n ^ 3-n) / 6 = C (n + 1, 3)
milhas

5

Oitava , 47 40 33 bytes

@(n)[k=(n^3-n)/6,k,-k-1,1-k,n].^3

Experimente online!

Salvei 6 bytes graças a Giuseppe, pois esqueci de remover alguns parênteses antigos. Salvou outros bytes alterando os sinais, graças a rafa11111.

Usa a fórmula na postagem math.se vinculada :

  1. Como n - n ^ 3 = n (1-n) (1 + n), então 6 | (n - n ^ 3) e podemos escrever n - n ^ 3 = 6k .
  2. 6k = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3 .

Parece ser mais longo se eu tentar resolver a equação: (nn ^ 3) = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3 com relação a k , em vez de apenas usando a equação.


3

Funções do Minecraft (18w11a, snapshots de 1,13), 813 bytes

cubos perfeitos em minecraft

Utiliza seis funções:

uma

scoreboard objectives add k dummy
scoreboard objectives add b dummy
scoreboard objectives add c dummy
scoreboard players operation x k = x n
function d
function f
scoreboard players operation x k -= x b
scoreboard players set x b 6
scoreboard players operation x k /= x b
scoreboard players set x b 1
function d
scoreboard players operation x c += x b
function f
scoreboard players set x b 1
function d
scoreboard players operation x c -= x b
function f
function d
function e
scoreboard players operation x b -= x c
scoreboard players operation x b -= x c
function c
function b

b

tellraw @s {"score":{"name":"x","objective":"b"}}

c

scoreboard players operation x b *= x c
scoreboard players operation x b *= x c
function b

d

scoreboard players operation x c = x k

e

scoreboard players operation x b = x c

f

function e
function c

"Recebe entrada" de um objetivo do placar chamado n, crie-o com /scoreboard objectives add n dummye, em seguida, defina-o usando /scoreboard players set x n 5. Em seguida, chame a função usando/function a

Usa a fórmula desta resposta math.se



2

MATL , 21 bytes

|_G|&:5Z^3^t!sG=fX<Y)

Isso tenta todas as cinco tuplas de números do conjunto (-abs(n))^3, (-abs(n)+1)^3, ..., abs(n)^3. Portanto, é muito ineficiente.

Experimente online!


2

Haskell , 43 42 bytes

p n|k<-div(n^3-n)6=map(^3)[n,-k-1,1-k,k,k]

Apenas a resposta popular, traduzida para Haskell. Obrigado a @ rafa11111 por salvar um byte!

Experimente online!


2
Você pode salvar um byte mudando o sinal na katribuição ...
rafa11111

2

Casca , 12 bytes

ḟo=⁰Σπ5m^3İZ

Experimente online!

Tenta todas as listas possíveis de 5 cubos e retorna o primeiro com a soma correta.

Explicação

ḟo=⁰Σπ5m^3İZ
          İZ    List of all integers [0,1,-1,2,-2,3,-3...
       m^3      Cube of each integer [0,1,-1,8,-8,27,-27...
     π5         Cartesian power with exponent 5. This returns a list of all possible
                lists built by taking 5 elements from the input list. This infinite
                list is ordered in such a way that any arbitrary result occurs at a 
                finite index.
ḟo              Find and return the first element where...
    Σ             the sum of the five values
  =⁰              is equal to the input

1

C (gcc) , 85 81 75 bytes

Economizou 4 bytes e 6 bytes graças à reordenação de atribuições do @catcat

r[5];f(n){r[1]=(n=(n-(*r=n*n*n))/6+1)*n*n--;r[3]=r[4]=-n*n*n;r[2]=--n*n*n;}

Experimente online!



1

Python 3, 65 61 60 bytes

lambda N:[n**3for k in[(N**3-N)//6]for n in[N,-k-1,1-k,k,k]]

Editar: eliminou alguns espaços desnecessários.

Edit: graças à reordenação inteligente de rafa11111.

Inspirado por isso .

Experimente online!


Você pode salvar um byte usando (N**3-N)e[N,1-k,-1-k,k,k]
rafa11111

1
@ rafa11111 reordenação inteligente. Obrigado.
Guoyang Qin 04/04


1

APL (Dyalog Unicode) , 30 26 bytes

3*⍨⊢,∘(1 ¯1∘+,2⍴-)6÷⍨⊢-*∘3

Experimente online!

Tradução da resposta de LeakyNun em APL .

Graças a Adám por 4 bytes, ficando tácito.

Quão?

3*⍨⊢,∘(1 ¯1∘+,2⍴-)6÷⍨⊢-*∘3  Tacit function
                   6÷⍨⊢-*∘3  (n-n^3)/6 (our k)
                 -)          Negate
               2            Repeat twice; (yields -k -k)
       (1 ¯1∘+,              Append to k+1, k-1
     ,∘                      Then append to
                            n
3*⍨                          And cube everything

Desculpe se perdi alguma coisa, mas: 1) já que existe uma tarefa, sua resposta aqui não é apenas um trecho? 2) embora você tenha usado 30 caracteres, por estar em unicode, não está usando 43 bytes, como apontado em tio?
Rafa11111

1
@ rafa11111 Não e não: o APL funciona estranhamente no TIO. A atribuição no campo "Código" é na verdade apenas um atalho para usar a função no campo "Entrada"; é completamente desnecessário o código real funcionar. Além disso, contamos cada caractere como um byte porque, para o Dyalog APL, usamos o SBCS do @ Adám. Posso adicionar o link à meta post explicando mais tarde, mas estou no celular agora.
J. Sallé 04/04

Ah eu vejo. Eu não sabia sobre isso. Obrigado por explicar!
Rafa11111

1

Casca , 20 bytes

m^3m‼:_:→:←;K¹÷6Ṡ-^3

Experimente online!

Usa a fórmula desta postagem .

Explicação

m^3m‼:_:→:←;K¹÷6Ṡ-^3  Implicit input
                Ṡ-    Subtract itself from it
                   ^3    raised to the third power
              ÷6       Divide by six
   m                   Map over the value with a list of functions:
           ;             Create a singleton list with
            K¹             the function of replace by the input
         :←              Append the function of decrement
       :→                Append the function of increment
    ‼:_                  Append the function of negate twice
m^3                    Cube the numbers of the list

1

x86, 41 39 bytes

Implementação principalmente direta da fórmula com entrada ecxe saída na pilha.

O interessante é que usei uma função de cubo, mas como call labelsão 5 bytes , armazeno o endereço do rótulo e uso 2 bytes call reg. Além disso, como estou pressionando valores em minha função, uso um em jmpvez de ret. É muito possível que ser inteligente com um loop e a pilha possa evitar pagar completamente.

Não fiz truques sofisticados com cubos, como usar (k+1)^3 = k^3 + 3k^2 + 3k + 1 .

Changelog:

  • Corrija a contagem de bytes usando em notvez de neg/ dec.

  • -2 bytes por não xoring, edxpois provavelmente é 0 de imul.

.section .text
.globl main

main:
        mov     $10, %ecx   # n = 10

start:
        lea     (cube),%edi # save function pointer
        call    *%edi       # output n^3

        sub     %ecx, %eax  # n^3 - n
                            # edx = 0 from cube
        push    $6
        pop     %ebx        # const 6        
        idiv    %ebx        # k = (n^3 - n)/6
        mov     %eax, %ecx  # save k

        call    *%edi       # output k^3
        push    %eax        # output k^3

        not     %ecx        # -k-1        
        call    *%edi       # output (-k-1)^3

        inc     %ecx        
        inc     %ecx        # -k+1
        call    *%edi       # output (-k+1)^3

        ret

cube:                       # eax = ecx^3
        pop     %esi 
        mov     %ecx, %eax
        imul    %ecx
        imul    %ecx

        push    %eax        # output cube
        jmp     *%esi       # ret

Objdump:

00000005 <start>:
   5:   8d 3d 22 00 00 00       lea    0x22,%edi
   b:   ff d7                   call   *%edi
   d:   29 c8                   sub    %ecx,%eax
   f:   6a 06                   push   $0x6
  11:   5b                      pop    %ebx
  12:   f7 fb                   idiv   %ebx
  14:   89 c1                   mov    %eax,%ecx
  16:   ff d7                   call   *%edi
  18:   50                      push   %eax
  19:   f7 d1                   not    %ecx
  1b:   ff d7                   call   *%edi
  1d:   41                      inc    %ecx
  1e:   41                      inc    %ecx
  1f:   ff d7                   call   *%edi
  21:   c3                      ret    

00000022 <cube>:
  22:   5e                      pop    %esi
  23:   89 c8                   mov    %ecx,%eax
  25:   f7 e9                   imul   %ecx
  27:   f7 e9                   imul   %ecx
  29:   50                      push   %eax
  2a:   ff e6                   jmp    *%esi

Aqui está a minha versão de teste que faz todo o cubo no final. Depois que os valores são pressionados na pilha, o loop do cubo substitui os valores da pilha. Atualmente, são 42 40 bytes, mas deve haver algumas melhorias em algum lugar.

.section .text
.globl main

main:
        mov     $10, %ecx       # n = 10

start:
        push    %ecx            # output n

        mov     %ecx, %eax
        imul    %ecx
        imul    %ecx
        sub     %ecx, %eax      # n^3 - n
                                # edx = 0 from imul

        push    $6
        pop     %ecx            # const 6        
        idiv    %ecx            # k = (n^3 - n)/6

        push    %eax            # output k
        push    %eax            # output k

        not     %eax            # -k-1        
        push    %eax            # output -k-1

        inc     %eax            
        inc     %eax            # -k+1
        push    %eax            # output -k+1

        dec     %ecx            # count = 5
        add     $20, %esp
cube:           
        mov     -4(%esp),%ebx   # load num from stack
        mov     %ebx, %eax
        imul    %ebx
        imul    %ebx            # cube 
        push    %eax            # output cube
        loop    cube            # --count; while (count)

        ret




0

Núcleo do PowerShell , 52 bytes

$o,(1-($k=($o*$o-1)*$o/6)),(-$k-1),$k,$k|%{$_*$_*$_}

Experimente online!

Usa a equação o=o^3 + (1-k)^3 + (-k-1)^3 + k^3 + k^3, where k=o^3 - o; esta é uma refatoração menor do popular l=o-o^3(com k=-l).

Como nota lateral, a expressão l=o-o^3parece um gato com uma orelha machucada.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.