C, 115 byte
#include<math.h>
#define D(K,L)K(x){return L;}
D(q,0)D(w,x+x)D(e,x*x)D(r,pow(x,x))(*g[])()={q,w,e,r};D(f,g[x%4](x))
Contoh adalah fungsi int f(int x)
Ini berpura-pura untuk kecepatan kerja tercepat karena menjauhkan CPU dari menggunakan lompatan bersyarat. Dan ini hanya cara optimalisasi kecepatan yang benar untuk tugas ini. Juga, ia mencoba untuk tidak mengevaluasi semuanya, seperti pada contoh array C return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
Tetapi tetapi dengan bijak menggunakan array pointer ke functons, untuk membuat lompatan tanpa syarat yang jauh lebih cepat (jmp / panggilan) dengan aritmatika alamat yang jauh lebih cepat, sebagai versi yang dioptimalkan dari " switch () - case .. ". Teknik ini bisa juga berguna dalam beberapa jenis finita automata - seperti emulator prosesor, pelaksana, pengurai aliran perintah, dan sebagainya - di mana masalah kecepatan dan kode suka switch(x%4) case(0):... case(1):...
tidak cocok karena menghasilkan beberapa instruksi cmp / jnz; dan ini adalah operasi yang mahal untuk CPU
Program uji paling sederhana dan tersingkat (dalam kondisi default) untuk kasus ini adalah sebagai berikut:
D(main,f(x))
Ini akan menambah hanya 12 byte payload dan akan total ukuran kita menjadi 127 byte;
Tetapi Anda sebaiknya memberi tahu linker untuk menggunakan f
fungsi sebagai titik masuk, alih-alih main
. Itulah caranya, jika kami bertujuan untuk mendapatkan biner yang berfungsi paling cepat untuk tugas ini dari kode terpendek ;-) Ini terjadi karena pustaka C menambahkan kode init / shutdown tambahan sebelum memanggil fungsi utama () Anda.
Kode mengkompilasi pada Komunitas MSVS 2015 tanpa ada trik dan masalah dan menghasilkan hasil yang benar. Saya belum mengujinya dengan gcc, tapi saya yakin itu akan berfungsi dengan baik juga.
0
kasus menjadix + 2
, melihat bagaimana yang lainx * 2
,x ^ 2
danx ^^ 2
(tetration)? : P