x86, 41 39 Bytes
Meist unkomplizierte Umsetzung der Formel mit Ein- ecxund Ausgabe auf dem Stack.
Das Interessante ist, dass ich eine Cubing-Funktion verwendet habe, aber da sind call labeles 5 Bytes , speichere ich die Adresse des Etiketts und verwende die 2 Bytes call reg. Da ich in meiner Funktion Werte pushe, verwende ich jmpstatt ret. Es ist sehr wahrscheinlich, dass ein geschickter Umgang mit einer Schleife und dem Stack einen Aufruf ganz vermeiden kann.
Ich habe keine ausgefallenen Tricks mit Würfeln gemacht, wie mit (k+1)^3 = k^3 + 3k^2 + 3k + 1.
Änderungsprotokoll:
Anzahl der Bytes korrigieren mit notanstelle von neg/dec .
-2 Bytes von nicht xoring , edxda es wahrscheinlich 0 aus ist 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
Objektspeicherauszug:
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
Hier ist meine Testversion, die das Cubing am Ende erledigt. Nachdem die Werte auf den Stapel verschoben wurden, überschreibt die Cube-Schleife die Stapelwerte. Derzeit sind es 42 bis 40 Bytes, aber irgendwo sollte es einige Verbesserungen geben.
.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
-10andere mögliche Lösung könnte-1000+4574296+4410944-4492125-4492125beispielsweise sein. Und darf ausgegeben werden--oder+-anstelle von+/-bzw. (dh3 = 27+-27+-125--64--64anstelle von3 = 27-27-135+64+64)?