x86, 41 39 byte
Sebagian besar implementasi langsung dari formula dengan input ecx
dan output pada stack.
Yang menarik adalah saya menggunakan fungsi cubing, tetapi karena call label
5 byte , saya menyimpan alamat label dan menggunakan 2 byte call reg
. Juga, karena saya mendorong nilai dalam fungsi saya, saya menggunakan jmp
bukan 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:
.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
-10
solusi lain yang mungkin bisa-1000+4574296+4410944-4492125-4492125
misalnya. Dan apakah itu diperbolehkan untuk menghasilkan--
atau+-
bukannya+
/-
masing-masing (yaitu3 = 27+-27+-125--64--64
bukannya3 = 27-27-135+64+64
)?