首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

IOCCC 國際混亂 C 代碼大賽:那些令人嘆為觀止的獲獎作品

     編輯:關於C

什麼是 IOCCC?

IOCCC (International Obfuscated C Code Contest) 是全球最著名的「寫出最難閱讀、最扭曲 C 代碼」的比賽,自 1984 年創辦至今已超過 30 屆。參賽作品往往利用前處理器技巧、遞歸、位運算、未定義行為等,將代碼壓縮成幾乎無法辨識的「亂碼」,卻能編譯執行並產生驚人輸出(如繪圖、遊戲、甚至編譯器)。

經典範例賞析

1. 1988 年獲獎作品:「十二日頌」自動生成器

這段代碼看起來像亂碼,編譯執行後卻能完整印出《聖誕十二日》歌詞,且源碼中完全沒有任何歌詞字串:

#include 
main(t,_,a) char *a; {
    return !0 < t ? t < 3 ? main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)) :
        1, t < _ ? main(t+1,_,a) : 3, main(-94,-27+t,a) && t == 2 ? _ < 13 ?
        main(2,_+1,"%s %d %d\n") : 9 : 16 : t < 0 ? t < -72 ? main(_,t,
        "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
        ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
        q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){nl]'/+#n';d}rw' i;# \
        ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
        iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
        ;;{nl'-{}rw]'/+,}##'*#nc,'#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')#\
        }'+}##(!!/") : t < -50 ? _ == *a ? putchar(31[a]) : main(-65,_,a+1) :
        main((*a=='/')+t,_,a+1) : 0 < t ? main(2,2,"%s") : *a=='/' || main(0,main(-61,*a,
        "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

執行方式:


gcc -o ioccc1988 ioccc1988.c
./ioccc1988 "ash nazg durhbatuluhk, ash nazg gimbatul, ash nazg thrakatuluhk, agh burzhumh-ishi krimpatul." > output.pgm

輸出為 PGM 圖片格式,可用圖片檢視器開啟。

2. 光線追蹤渲染器 (約 2000 年左右)

幾百字元實現完整光線追蹤,輸出 PPM 格式圖片:


X=1024; Y=768; A=3;
J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:??AAF"
"FHHMMOO55557799@@>>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/"
"31/531/53"[b]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0,I(x,Y/2,X)):(E=X);}
H(x){I(x,_,0);}p;q(c,x,y,z,k,l,m,a,b){F(c);x-=E*M;y-=S*M;z-=C*M;b=x*x/M+y*y/M+z*z/M-D*D*M;
a=-x*k/M-y*l/M-z*m/M;p=((b=a*a/M-b)>=0?(I(b*M,_,0),b=E,a+(a>b?-b:b)):-1.0);}
Z;W;o(c,x,y,z,k,l,m,a){Z=!c?-1:Z;c<44?(q(c,x,y,z,k,l,m,0,0),(p>0&&c!=a&&(p0&&Z>=0?(e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Z),
u=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w)/3,H(u*u+v*v+w*w),b/=D,b*=b,b*=200,b/=(M*M),V=Z,E!=0?
(u=-u*M/E,v=-v*M/E,w=-w*M/E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2),i-=v*E/(M/2),j-=w*E/(M/2),
n(e,f,g,h,i,j,d-1,Z,0,0),Q/=2,T/=2,U/=2,V=V<22?7:(V<30?1:(V<38?2:(V<44?4:(V==44?6:3))))
,Q+=V&1?b:0,T+=V&2?b:0,U+=V&4?b:0):(d==P?(g+=2,j=g>0?g/8:g/20):0,j>0?(U=j*j/M,Q=255-250*U/M,
T=255-150*U/M,U=255-100*U/M):(U=j*j/M,UO?O:Q;T=T<0?0:T>O?O:T;U=U<0?0:U>O?O:U;}R;G;B;t(x,y,a,b){n(M*J+M*40*(A*x+a)/X/A-M*20,
M*K,M*L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P,-1,0,0);R+=Q;G+=T;B+=U;++a

編譯執行:


gcc -o ray ray.c
./ray > ioccc_ray.ppm

等待數秒至數分鐘(視 CPU),產生一張光線追蹤渲染圖片。

3. 函數繪圖器

輸入係數即可繪製多項式圖形:


#include 
#include 
#include 
#define _ ;double
#define void x,x
#define case(break,default) break[O]:default[O]:
#define switch(bool) ;for(;xint##if?
#define true (--void++)
#define false (++void--)
char*O=" <60>!?\\\n" _ doubIe[010] _ int0,int1 _ Iong=0 _ inIine(int eIse){int
O1O=!O _ l=!O;for(;O1O<010;++O1O)l+=(O1O[doubIe]*pow(eIse,O1O));return l;}int
main(int booI,char*eIse[]){int I=1,x=-*O;if(eIse){for(;I<010+1;I++)I[doubIe-1]
=booI>I?atof(I[eIse]):!O switch(*O)x++)abs(inIine(x))>Iong&&(Iong=abs(inIine(x
)));int1=Iong;main(-*O>>1,0);}else{if(booI<*O>>1){int0=int1;int1=int0-2*Iong/0
[O]switch(5[O]))putchar(x-*O?(int0>=inIine(x)&&do(1,x)do(0,true)do(0,false)
case(2,1)do(1,true)do(0,false)6[O]case(-3,6)do(0,false)6[O]-3[O]:do(1,false)
case(5,4)x?booI?0:6[O]:7[O])+*O:8[O]),x++;main(++booI,0);}}}

執行 ./plot 0 0 1 畫 x^2,./plot -1 0 0 1 畫 x^3-1。

4. 高精度開方


#include 
int l; int main(int o,char **O, int I){char c,*D=O[1];if(o>0){
for(l=0;D[l];D[l++]-=10){D[l++]-=120;D[l]-=110;while(!main(0,O,l))D[l]+=20;
putchar((D[l]+1032)/20);}putchar(10);}else{c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
D[I]+=I<0?0:!(o=main(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);}return o;}

輸入 ./sqrt 01524157875019052100 可得高精度平方根(輸入位數需為偶數)。

5. ASCII 藝術:月亮與猜字遊戲

還有僅用遞歸與三角函數繪製月相、類 Hangman 猜字遊戲等佳作,皆在數百字元內完成極豐富功能。

為什麼要看 IOCCC?

  • 拓展語言邊界:深入理解 C 語言語法、前處理器、未定義行為的極限。
  • 審美與創意:代碼即藝術,許多作品兼具視覺美感與功能性。
  • 除錯訓練:嘗試解讀這些代碼,能極大提升閱讀複雜/惡劣代碼的能力。

資源連結

官方歷年獲獎作品庫:https://www.ioccc.org/years.html
(注意:部分作品需 Linux 環境、特定編譯器旗標才能編譯通過)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved