ผลรวมของห้าลูกบาศก์


33

ได้รับจำนวนเต็มส่งออกห้าก้อนที่สมบูรณ์แบบซึ่งผลรวมคือจำนวนเต็มนั้น โปรดทราบว่าคิวบ์อาจเป็นค่าบวกลบหรือศูนย์ ตัวอย่างเช่น,

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

ดังนั้นสำหรับอินพุต-10คุณสามารถเอาต์พุต[-64, -64, 64, 27, 27]ได้แม้ว่าจะมีวิธีแก้ไขปัญหาอื่น ๆ โปรดทราบว่าคุณควรส่งออกก้อนไม่ใช่ตัวเลขที่ถูกลูกบาศก์

มีวิธีแก้ไขอยู่เสมอ - คุณอาจสนุกกับมันด้วยตัวเอง มันเพิ่มเติมคาดเดาว่าสี่ก้อนพอเพียง


คำถามสองข้อ: เราสามารถให้ผลลัพธ์ใด ๆ หรือเล็กที่สุดได้หรือไม่ สำหรับ-10วิธีแก้ปัญหาที่เป็นไปได้อื่นอาจเป็น-1000+4574296+4410944-4492125-4492125ตัวอย่าง และอนุญาตให้ส่งออก--หรือ+-แทน+/ -ตามลำดับ (เช่น3 = 27+-27+-125--64--64แทนที่จะเป็น3 = 27-27-135+64+64) หรือไม่
Kevin Cruijssen

@KevinCruijssen ผลลัพธ์ใด ๆ ก็ใช้ได้ ถ้าคุณเอาท์พุทหมายถึงชอบ--5ผมว่าไม่เป็นไปตามกฎปกติในการแสดงผลการแสดงออก
xnor

@KevinCruijssen คุณไม่จำเป็นต้องแสดงออกด้วย+เครื่องหมายเพียงแค่แสดงตัวเลข
xnor

-10 = -64 - 64 + 64 + 27 + 27หรือ-10 = -343 + 0 -8 +125 +216
Angs

3
หมายเหตุที่น่าสนใจ: 3 ไม่เพียงพอ (บางหมายเลขไม่สามารถแสดงได้) แต่มีบางหมายเลขที่ไม่ทราบความเป็นตัวแทน (เช่น 33)
แยกผลไม้

คำตอบ:


16

Brachylogขนาด 18 ไบต์

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

ลองออนไลน์!

คำอธิบาย

โดยทั่วไปเราอธิบายปัญหาด้วยข้อ จำกัด เพิ่มเติมที่เราต้องการให้รายการเอาท์พุทไม่เพิ่มขึ้นในแง่ของขนาด: นี่เป็นการบังคับให้ Brachylog ย้อนกลับอย่างถูกต้องในการรวมกันของค่าที่เป็นไปได้ทั้งหมด 5 ค่า องค์ประกอบของรายการ

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

การค้นหาโซลูชันที่แตกต่าง

ด้วยการต่อท้าย a เป็นไปได้ที่จะใช้คำกริยานี้เพื่อค้นหาวิธีแก้ปัญหาทั้งหมดที่มีขนาดเพิ่มขึ้นตัวอย่างเช่นนี่คือคำตอบ 10 ข้อแรกสำหรับ42


14

Brachylogขนาด 11 ไบต์

ขอบคุณ Fatalize สำหรับการบันทึกหนึ่งไบต์

~+l₅≥₁.√₃ᵐ∧

ลองออนไลน์!

ประการแรก~+บังคับใช้ว่าเอาต์พุต ( .) ต้องรวมกับอินพุต l₅เอาท์พุท จำกัด อีกครั้งบอกว่ามันจะต้องมีความยาว 5. ≥₁ประกาศว่ารายการจะต้องอยู่ในลำดับที่ลดลง (ฉันเชื่อว่านี่เป็นสิ่งจำเป็นที่จะหยุดโปรแกรมเข้าสู่วงไม่มีที่สิ้นสุด)

เรารวมรายการนี้ไว้อย่างชัดเจนด้วย.ตัวแปรเอาต์พุตเนื่องจากเพรดิเคตถัดไปของเราจะ "เปลี่ยน" ค่าภายในรายการ √₃ᵐจากนั้นเราจะใช้รากที่สามของแต่ละค่าในรายการด้วย เนื่องจาก Brachylog นั้นเป็นเลขจำนวนเต็มซึ่งจะบอกว่าตัวเลขทั้งหมดในรายการคือหมายเลขคิวบ์

สุดท้ายเราใช้เพราะมีการ.เพิ่มโดยนัยในตอนท้ายของแต่ละบรรทัด เนื่องจากเราไม่ต้องการ.รวมเป็นหนึ่งเดียวกับรายการของรูทคิวบ์เราจึงรวมมันไว้ก่อนหน้านี้และใช้เพื่อหยุดการรวมเป็นหนึ่งตอนท้าย


10

Python 2 , 58 57 54 ไบต์

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

ลองออนไลน์!


  • -2 ไบต์ขอบคุณ Rod
  • -1 ไบต์ขอบคุณนีล

1
คุณสามารถบันทึกการแลกเปลี่ยนสัญญาณได้ 2 ไบต์k=-(n-n**3)/6;[v**3for v in~k,1-k,n,k,k]
Rod

1
@Rod สำหรับ-(n-n**3)คุณไม่สามารถใช้(n**3-n)?
Neil

@Neil ใช่คุณสามารถ
ร็อด

9

Python 3 , 65 ไบต์

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

ลองออนไลน์!

ฉันหมายถึงสูตรที่ชัดเจนอยู่ที่นี่ (แม้ว่าเขาจะสรุปสิ่งก่อสร้างที่มีอยู่จริง)


คุณสามารถบันทึกได้หนึ่งไบต์โดยการย้อนกลับkและเขียนสมการใหม่ ลองออนไลน์!
Jeff Freeman

ทำไมต้องกังวลกับการ cubing ซ้ำ ๆ ? ie codegolf.stackexchange.com/a/161235/17360
qwr

7

Java 8, 178 87 73 71 65 ไบต์

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

-6 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบายเดียวกันที่ด้านล่าง แต่ใช้สมการพื้นฐานแทนคำที่ได้รับมาก่อนหน้านี้ (ต้องขอบคุณPython 3 ของ@LeakyNunสำหรับคำตอบโดยนัย)

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

ลองออนไลน์


คำตอบเก่า 178 ไบต์:

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

ลองออนไลน์

คำอธิบาย:

ฉันวนซ้ำkตั้งแต่ 0 ขึ้นไปจนกระทั่งพบวิธีแก้ปัญหา ในการวนซ้ำทุกครั้งมันจะตรวจสอบสมการทั้งสองนี้:

  • บวกk: n == n 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3
  • ลบk: n == n 3 - (k + 1) 3 - (k-1) 3 + k 3 + k 3

ทำไม?

ตั้งแต่NN 3 = n * (1-n) * (1 + n)แล้ว6 | (NN 3 )ก็สามารถเขียนเป็นNN 3 = 6k
6k = (k + 1) 3 + (k-1) 3 - k 3 - k 3
และดังนั้นจึงn n = 3 + (k + 1) 3 + (k-1) 3 - k 3 - k 3สำหรับบางk
แหล่ง


1
65 ไบต์ : n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}(หรือ 64 ใช้ ints เพื่อผลลัพธ์ที่แม่นยำน้อยลง)
Olivier Grégoire

6

เยลลี่ขนาด 13 ไบต์

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

ลองออนไลน์!

คิดสูตรอย่างอิสระ (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.

ทางเลือก 13 ไบต์: ลองออนไลน์!


‘c3µ³;;;C;~*3ควรบันทึกไบต์ตั้งแต่ (n ^ 3-n) / 6 = C (n + 1, 3)
ไมล์

5

Octave , 47 40 33 bytes

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

ลองออนไลน์!

บันทึก 6 ไบต์ขอบคุณ Giuseppe เนื่องจากฉันลืมลบวงเล็บเก่าออก บันทึกอีกหนึ่งไบต์ด้วยการเปลี่ยนสัญญาณขอบคุณ rafa11111

ใช้สูตรในโพสต์ math.se ที่เชื่อมโยง:

  1. ตั้งแต่n - n ^ 3 = n (1-n) (1 + n)แล้ว6 | (n - n ^ 3)และเราสามารถเขียนn - n ^ 3 = 6k
  2. 6k = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3

ดูเหมือนว่าจะนานขึ้นถ้าฉันพยายามแก้สมการ: (nn ^ 3) = (k + 1) ^ 3 + (k-1) ^ 3 - k ^ 3 - k ^ 3 - k ^ 3โดยคำนึงถึงkแทนที่จะเป็นแค่ ใช้สมการ


3

ฟังก์ชั่น Minecraft (18w11a, 1.13 ภาพรวม), 813 ไบต์

perfect cubes in minecraft

ใช้หกฟังก์ชั่น:

a

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

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

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

d

scoreboard players operation x c = x k

อี

scoreboard players operation x b = x c

function e
function c

"จะเข้า" จากสกอร์วัตถุประสงค์ชื่อnสร้างมันด้วยและจากนั้นตั้งโดยใช้/scoreboard objectives add n dummy /scoreboard players set x n 5จากนั้นเรียกใช้ฟังก์ชันโดยใช้/function a

ใช้สูตรจากคำตอบ math.se นี้




2

Haskell , 43 42 ไบต์

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

เพียงคำตอบที่ได้รับความนิยมแปลเป็น Haskell ขอบคุณ @ rafa11111 สำหรับการบันทึกไบต์!

ลองออนไลน์!


2
คุณสามารถบันทึกหนึ่งไบต์ในการเปลี่ยนเครื่องหมายในการkมอบหมาย ...
rafa11111

2

Huskขนาด 12 ไบต์

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

ลองออนไลน์!

ลองรายการที่เป็นไปได้ทั้งหมด 5 คิวบ์และส่งกลับรายการแรกด้วยผลรวมที่ถูกต้อง

คำอธิบาย

ḟ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 ไบต์

บันทึกแล้ว 4 ไบต์จากนั้น 6 ไบต์ขอบคุณ @ การจัดลำดับการมอบหมายใหม่ของ @ 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;}

ลองออนไลน์!



1

Python 3, 65 61 60 ไบต์

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

แก้ไข: ทำช่องว่างที่ไม่จำเป็นออกไป

แก้ไข: ขอบคุณการจัดลำดับใหม่อย่างชาญฉลาดของ rafa11111

แรงบันดาลใจจากนี้

ลองออนไลน์!


คุณสามารถบันทึกหนึ่งไบต์โดยใช้(N**3-N)และ[N,1-k,-1-k,k,k]
rafa11111

1
@ rafa11111 การจัดเรียงสมาร์ทใหม่ ขอบคุณ
Guoyang Qin


1

APL (Dyalog Unicode) , 30 26 ไบต์

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

ลองออนไลน์!

APL แปลคำตอบของ LeakyNunคำตอบของ

ขอบคุณAdámเป็นเวลา 4 ไบต์โดยไปที่เงียบ

อย่างไร?

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

ขออภัยถ้าฉันพลาดบางสิ่ง แต่: 1) เนื่องจากใน tio มีการมอบหมายไม่ใช่คำตอบของคุณที่นี่เป็นเพียงตัวอย่างหรือไม่? 2) แม้ว่าคุณจะใช้ 30 ตัวอักษรเพราะมันเป็นยูนิโค้ดมันไม่ได้ใช้ 43 ไบต์เหมือนที่ชี้ใน tio?
rafa11111

1
@ rafa11111 ไม่และไม่: APL ทำงานแปลก ๆ ใน TIO การกำหนดในฟิลด์“ รหัส” เป็นเพียงทางลัดเพื่อใช้ฟังก์ชั่นในฟิลด์“ ป้อนข้อมูล” มันไม่จำเป็นอย่างสมบูรณ์สำหรับรหัสที่แท้จริงในการทำงาน นอกจากนี้เรายังนับอักขระแต่ละตัวเป็นหนึ่งไบต์เพราะสำหรับ Dyalog APL เราใช้ SBCS ของ @ Adám ฉันสามารถเพิ่มลิงค์ไปยังโพสต์เมตาอธิบายในภายหลัง แต่ตอนนี้ฉันอยู่บนมือถือ
J. Sallé

อ้อเข้าใจแล้ว. ฉันไม่รู้เกี่ยวกับสิ่งเหล่านี้ ขอบคุณที่อธิบาย!
rafa11111

1

Husk , 20 ไบต์

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

ลองออนไลน์!

ใช้สูตรจากโพสต์นี้

คำอธิบาย

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 ไบต์

การนำไปใช้ส่วนใหญ่ของสูตรตรงไปตรงมากับอินพุตecxและเอาต์พุตบนสแต็ก

สิ่งที่น่าสนใจก็คือว่าผมใช้ฟังก์ชั่น cubing แต่ตั้งแต่call labelไบต์ 5ผมเก็บที่อยู่ของฉลากและใช้ 2 call regไบต์ นอกจากนี้ตั้งแต่ฉันดันค่าในฟังก์ชั่นของฉันฉันใช้แทนjmp retเป็นไปได้อย่างมากว่าการใช้ลูปอย่างชาญฉลาดและสแต็กสามารถหลีกเลี่ยงการโทรได้ทั้งหมด

ฉันไม่ได้ทำแฟนซีเทคนิคใด ๆ กับ cubing (k+1)^3 = k^3 + 3k^2 + 3k + 1เช่นการใช้

การเปลี่ยนแปลง:

  • แก้ไขไบต์นับใช้notแทน/negdec

  • -2 ไบต์โดยไม่xorไอเอ็นจีedxเพราะมันอาจจะเป็น 0 จาก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

นี่คือเวอร์ชั่นทดสอบของฉันที่จะทำการลูกบาศก์ทั้งหมดในตอนท้าย หลังจากค่าถูกส่งบนสแต็กคิวบ์วนเขียนทับค่าสแต็ก ปัจจุบันคือ42 40 ไบต์ แต่ควรมีการปรับปรุงบางอย่าง

.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

PowerShell Coreขนาด 52 ไบต์

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

ลองออนไลน์!

ใช้สมการo=o^3 + (1-k)^3 + (-k-1)^3 + k^3 + k^3ที่k=o^3 - o; นี่คือการรีแฟคเตอร์ขนาดเล็กที่ได้รับความนิยมl=o-o^3(ด้วยk=-l )

ในฐานะที่เป็นหมายเหตุด้านการแสดงออกl=o-o^3ดูเหมือนแมวที่มีหูเจ็บ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.