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.