Jumlah lima kubus

33

Diberikan bilangan bulat, menghasilkan lima kubus sempurna yang jumlahnya adalah bilangan bulat itu. Perhatikan bahwa kubus bisa positif, negatif, atau nol. Sebagai contoh,

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

jadi untuk input -10Anda bisa mengeluarkan [-64, -64, 64, 27, 27], meskipun solusi lain mungkin. Perhatikan bahwa Anda harus mengeluarkan kubus, bukan angka yang dipotong dadu.

Sebuah solusi selalu ada - Anda mungkin menikmati kebingungan untuk diri sendiri. Lebih jauh dugaan bahwa empat kubus sudah cukup.

Tidak
sumber
Dua pertanyaan: Bisakah kita mengeluarkan hasil apa pun, atau hanya yang terkecil? Untuk -10solusi lain yang mungkin bisa -1000+4574296+4410944-4492125-4492125misalnya. Dan apakah itu diperbolehkan untuk menghasilkan --atau +-bukannya +/ -masing-masing (yaitu 3 = 27+-27+-125--64--64bukannya 3 = 27-27-135+64+64)?
Kevin Cruijssen
@KevinCruijssen Hasil apa pun baik-baik saja. Jika yang Anda maksud adalah output like --5, saya akan mengatakan tidak, seperti aturan biasa untuk menghasilkan ekspresi .
xnor
@KevinCruijssen Anda tidak perlu menampilkan ekspresi dengan +tanda, cukup angka.
xnor
-10 = -64 - 64 + 64 + 27 + 27atau-10 = -343 + 0 -8 +125 +216
Angs
3
Catatan menarik: 3 tidak mencukupi (beberapa angka tidak dapat ditampilkan), tetapi ada beberapa angka yang keterwakilannya tidak diketahui (seperti 33).
Buah Esolanging

Jawaban:

16

Brachylog , 18 byte

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

Cobalah online!

Penjelasan

Kami pada dasarnya menggambarkan masalahnya, dengan kendala tambahan yang kami inginkan agar daftar keluaran tidak bertambah dalam hal besaran: ini memaksa Brachylog untuk mundur dengan benar semua kombinasi 5 nilai yang mungkin, alih-alih menelusuri kembali secara tak terbatas nilai yang terakhir elemen daftar.

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

Menemukan solusi yang berbeda

Dengan menambahkan a , dimungkinkan untuk menggunakan predikat ini untuk menemukan semua solusi dengan besaran yang meningkat: misalnya, berikut adalah 10 solusi pertama untuk42

Fatalisasi
sumber
14

Brachylog , 11 byte

Terima kasih Fatalize untuk menghemat satu byte

~+l₅≥₁.√₃ᵐ∧

Cobalah online!

Pertama ~+menegaskan bahwa output ( .) harus dijumlahkan ke input. l₅lagi membatasi output, mendikte bahwa itu harus memiliki panjang 5. ≥₁menyatakan bahwa daftar harus dalam urutan menurun (saya percaya bahwa ini diperlukan untuk menghentikan program memasuki infinite loop)

Kami secara eksplisit menyatukan daftar ini dengan ., variabel output, karena predikat kami berikutnya akan "mengubah" nilai-nilai di dalam daftar. Kami kemudian mengambil akar pangkat tiga dari setiap nilai dalam daftar √₃ᵐ. Karena Brachylog secara inheren berbasis integer, ini menentukan bahwa semua angka dalam daftar adalah angka kubus.

Akhirnya, kami menggunakan karena ada implisit yang .ditambahkan ke akhir setiap baris. Karena kami tidak ingin .disatukan dengan daftar akar pangkat tiga, kami menyatukannya sebelumnya dan menggunakannya untuk menghentikannya pada akhir.

H.Piz
sumber
10

Python 2 , 58 57 54 byte

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

Cobalah online!


  • -2 byte, terima kasih kepada Rod
  • -1 byte, terima kasih kepada Neil
TFeld
sumber
1
Anda dapat menyimpan 2 byte menukar sinyalk=-(n-n**3)/6;[v**3for v in~k,1-k,n,k,k]
Rod
1
@Rod For -(n-n**3)bisakah Anda tidak menggunakan (n**3-n)?
Neil
@Neil ya, Anda bisa.
Rod
9

Python 3 , 65 byte

def f(n):k=(n-n**3)//6;return[n**3,(k+1)**3,(k-1)**3,-k**3,-k**3]

Cobalah online!

Maksudku, formula eksplisit bahkan ada di sini (meskipun dia mengabstraksikan konstruksi di balik eksistensial)

Biarawati Bocor
sumber
Anda dapat menyimpan tepat satu byte dengan membalik kdan menulis ulang persamaan Anda. Cobalah online!
Jeff Freeman
Mengapa repot dengan pengulangan cubing? yaitu codegolf.stackexchange.com/a/161235/17360
qwr
7

Java 8, 178 87 73 71 65 byte

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

-6 byte terima kasih kepada @ OlivierGrégoire .

Penjelasan yang sama di bagian bawah, tetapi menggunakan persamaan dasar alih-alih yang diturunkan yang saya gunakan sebelumnya (terima kasih kepada jawaban Python 3 dari @LeakyNun untuk tip tersirat):

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

Cobalah online.


Jawaban lama 178 byte:

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

Cobalah online.

Penjelasan:

Saya loop kdari 0 ke atas sampai solusi ditemukan. Dalam setiap iterasi, ia akan memeriksa dua persamaan ini:

  • Positif k: n == n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3
  • Negatif k: n == n 3 - (k + 1) 3 - (k-1) 3 + k 3 + k 3

Mengapa?

Karena n - n 3 = n * (1-n) * (1 + n) dan kemudian 6 | (nn 3 ) , dapat ditulis sebagai n - n 3 = 6k .
6k = (k + 1) 3 + (k-1) 3 - k 3 - k 3 .
Dan karena itu n = n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3 untuk beberapa k .
Sumber.

Kevin Cruijssen
sumber
1
65 byte : n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}(atau 64 menggunakan ints untuk hasil yang kurang tepat)
Olivier Grégoire
6

Jelly , 13 byte

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

Cobalah online!

Cari tahu rumusnya secara mandiri. (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.

Alternatif 13 byte: Cobalah online!

pengguna202729
sumber
‘c3µ³;;;C;~*3harus menyimpan byte sejak (n ^ 3-n) / 6 = C (n +1, 3)
miles
5

Oktaf , 47 40 33 byte

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

Cobalah online!

Disimpan 6 byte berkat Giuseppe, karena saya lupa menghapus beberapa tanda kurung lama. Disimpan byte lain dengan mengubah tanda-tanda, terima kasih kepada rafa11111.

Menggunakan rumus dalam pos math.se yang ditautkan :

  1. Karena n - n ^ 3 = n (1-n) (1 + n) maka 6 | (n - n ^ 3) dan kita dapat menulis n - n ^ 3 = 6k .
  2. 6k = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3 .

Tampaknya lebih lama jika saya mencoba menyelesaikan persamaan: (nn ^ 3) = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3 berkaitan dengan k , bukan hanya menggunakan persamaan.

Stewie Griffin
sumber
3

Fungsi Minecraft (18w11a, 1,13 foto), 813 byte

kubus sempurna di minecraft

Menggunakan enam fungsi:

Sebuah

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

"Mengambil input" dari tujuan papan skor bernama n, buat dengan /scoreboard objectives add n dummy, lalu setel menggunakan /scoreboard players set x n 5. Kemudian panggil fungsi menggunakan/function a

Gunakan rumus dari jawaban math.se ini

Noskcaj
sumber
2

JavaScript (Node.js) , 48 45 byte

  • terima kasih kepada @Arnauld untuk mengurangi 3 byte
n=>[n,1-(k=(n**3-n)/6|0),~k,k,k].map(x=>x**3)

Cobalah online!

DanielIndie
sumber
1
Mengapa |0? n**3-nharus merupakan kelipatan 6 untuk integer n.
Neil
2

MATL , 21 byte

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

Ini mencoba semua 5-tupel angka dari set (-abs(n))^3, (-abs(n)+1)^3, ..., abs(n)^3. Jadi sangat tidak efisien.

Cobalah online!

Luis Mendo
sumber
2

Haskell , 43 42 byte

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

Hanya jawaban yang populer, diterjemahkan ke Haskell. Terima kasih kepada @ rafa11111 karena telah menghemat satu byte!

Cobalah online!

Angs
sumber
2
Anda dapat menyimpan satu byte mengubah tanda dalam kpenugasan ...
rafa11111
2

Sekam , 12 byte

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

Cobalah online!

Mencoba semua daftar kemungkinan 5 kubus, dan mengembalikan yang pertama dengan jumlah yang benar.

Penjelasan

ḟ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
Leo
sumber
1

C (gcc) , 85 81 75 byte

Disimpan 4 byte dan kemudian 6 byte berkat re-order tugas dari ceilingcat

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

Cobalah online!

ay
sumber
1

Fortran (GFortran) , 53 byte

READ*,N
K=(N**3-N)/6
PRINT*,(/N,1-K,-1-K,K,K/)**3
END

Cobalah online!

Fortran mengalahkan Python? Apa yang terjadi di sini?

rafa11111
sumber
1

Python 3, 65 61 60 byte

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

Edit: hilangkan beberapa ruang yang tidak perlu.

Sunting: terima kasih atas penataan ulang cerdas rafa11111.

Terinspirasi oleh ini .

Cobalah online!

Guoyang Qin
sumber
Anda dapat menyimpan satu byte menggunakan (N**3-N)dan[N,1-k,-1-k,k,k]
rafa11111
1
@ rafa11111 pemesanan ulang pintar. Terima kasih.
Guoyang Qin
1

R , 40 38 byte

Manfaatkan rumus dalam pos math.SE yang ditautkan. Turun ke 2 byte berkat Giuseppe.

c(n<-scan(),k<-(n^3-n)/6,k,1-k,-k-1)^3

Cobalah online!

rturnbull
sumber
38 bytes
Giuseppe
1

APL (Dyalog Unicode) , 30 26 byte

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

Cobalah online!

Terjemahan APL dari jawaban LeakyNun .

Terima kasih kepada Adám selama 4 byte dengan menjadi diam-diam.

Bagaimana?

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
J. Sallé
sumber
Maaf jika saya melewatkan sesuatu, tetapi: 1) karena di tio ada tugas, bukankah jawaban Anda di sini hanya cuplikan? 2) walaupun Anda menggunakan 30 karakter, karena itu dalam unicode, bukankah itu menggunakan 43 byte, seperti yang ditunjukkan dalam tio?
rafa11111
1
@ rafa11111 Tidak dan tidak: APL bekerja aneh di TIO. Penugasan di bidang "Kode" sebenarnya hanyalah jalan pintas untuk menggunakan fungsi di bidang "Input"; itu benar-benar tidak perlu untuk kode yang sebenarnya untuk bekerja. Selain itu, kami menghitung setiap karakter sebagai satu byte karena untuk Dyalog APL, kami menggunakan @ Adám's SBCS. Saya dapat menambahkan tautan ke meta post yang menjelaskannya nanti, tetapi saya sedang di ponsel sekarang.
J. Sallé
Oh begitu. Saya tidak tahu tentang ini. Terima kasih telah menjelaskan!
rafa11111
1

Sekam , 20 byte

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

Cobalah online!

Menggunakan rumus dari pos ini .

Penjelasan

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
Fyr
sumber
1

x86, 41 39 byte

Sebagian besar implementasi langsung dari formula dengan input ecxdan output pada stack.

Yang menarik adalah saya menggunakan fungsi cubing, tetapi karena call label5 byte , saya menyimpan alamat label dan menggunakan 2 byte call reg. Juga, karena saya mendorong nilai dalam fungsi saya, saya menggunakan jmpbukan ret. Sangat mungkin bahwa menjadi pandai dengan loop dan stack dapat menghindari panggilan sepenuhnya.

Saya tidak melakukan trik mewah dengan cubing, seperti menggunakan (k+1)^3 = k^3 + 3k^2 + 3k + 1.

Changelog:

  • Perbaiki jumlah byte menggunakan notbukan neg/ dec.

  • -2 byte dengan tidak xoring edxkarena mungkin 0 dari 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

Inilah versi pengujian saya yang melakukan semua cubing pada akhirnya. Setelah nilai didorong pada stack, loop kubus menimpa nilai stack. Saat ini 42 40 byte tetapi harus ada beberapa perbaikan di suatu tempat.

.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
qwr
sumber
0

Secara kubik , 51 karakter, 55 byte

⇒-6-^0+7/0»8
$F:^0%@5-7/0»8^0%@5%@5f1+8^0%@5f1-8^0%

Cobalah online!

Rupanya MDXF lupa untuk mengimplementasikan SBCS ...

pengguna202729
sumber
0

Perl 5 -nE, 48 byte

say$_**3for$i=($_**3-($n=$_))/6,$i,-1-$i,1-$i,$n

ujung topi

msh210
sumber
0

PowerShell Core , 52 byte

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

Cobalah online!

Gunakan persamaan o=o^3 + (1-k)^3 + (-k-1)^3 + k^3 + k^3, di mana k=o^3 - o; ini adalah refactoring minor dari yang populer l=o-o^3(dengan k=-l).

Sebagai catatan, ekspresi itu l=o-o^3terlihat seperti kucing dengan telinga yang terluka.

Jeff Freeman
sumber