2009年4月18日 星期六

國際C語言混亂代碼大賽 (The International Obfuscated C Code Contest)

因為需要閱讀一小段PERL寫的程式碼,找資料當中,發現PERL有舉辦『PERL難以閱讀程式碼大賽』。心裡第一個想到的是C語言也應該會有吧,找了一下,果然C語言也有這一類的比賽

“國際C語言混亂代碼大賽(IOCCC, The International Obfuscated C Code Contest)是一項國際編程賽事,從1984年開始,每年舉辦一次(1997年、1999年、2002年、2003年和2006年例外)。目的是寫出最有創意的最讓人難以理解的C語言代碼。”
WIKI

國際C語言混亂代碼大賽年度網頁:
http://www.ioccc.org/years.html


範例:

cdua/12th International Obfuscated C Code Contest



把這個網頁分享給友人看過後,大家開始亂翻IOCCC官網上的作品,因為能上官網的都是得獎作品。官網上的作品大都以固定的格式發佈,基本格式就是:
Makefile
程式碼(*.c)
作者提示(*.hint)

例如:
anonymous
‧Makefile
‧anonymous.c 程式碼
‧anonymous.hint 作者提示

最普遍看到的混亂技巧就是用程式碼排圖案,也被稱為ASCII ARTWIKI就有兩個範例,一個是算圓周率的程式把程式碼排成圓形,另一個就是飛行模擬器城是把程式排成飛機圖案

另外,有些混亂技巧並非顯而易見,需要靠『作者提示』比較容易看懂,因為有時候程式碼是藏在你想不到的地方 :P。例如:TY發現的biggar (1987),打開biggar.c只看到



就沒了,乍看之下這個東西怎麼可能編譯的過,後來不經意看到他的biggar.hint 寫著:
“cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" -DP="main(){X}"\ -DR="read(0,&c,1)" -DT="c!=015" -DW="while(C)I" -DX="char c;W" markb.c”
加上編譯時的參數,答案就很明顯了,真的是很惡搞,令人會心一笑


以下是一些節錄自國際C語言混亂代碼大賽 (The International Obfuscated C Code Contest)網頁的比賽作品

gavare (2004)
Makefile
gavare.c
gavare.hint


vik2 (2004)
Makefile
vik2.c
vik2.hint


kev (2001)
Makefile
kev.c
kev.hint


tomtorfs (1998)
Makefile
tomtorfs.c
tomtorfs.hint


dalbec (1996)
Makefile
dalbec.c
dalbec.hint


biggar (1987)
Makefile
biggar.c
biggar.hint


arachnid (2004)
Makefile
arachnid.c
arachnid.hint
arachnid.orig.c
arachnid.info 自定迷宮地圖


最後一個是迷宮程式,乍看之下,認為它只是把程式碼排成迷宮,印一些字串而已。友人NEO很熱誠地去編譯並且執行,發現它居然是一個迷宮遊戲!而且還可以透過參數送給迷宮程式新的迷宮地圖(arachnid.info),邊走邊畫,走到邊緣就換頁,功能完整!


編譯與執行 (NEO提供)







1. 用vi瀏覽程式碼
2. 編譯
3. 執行並送入迷宮地圖(arachnid.info)



某IOCCC得獎者去求職..
『主管您好,這是我寫過的CODE』(遞~)

(程式碼裡面都是飛機、大象、愛心、涼宮春日...)



0 意見:

Related Posts with Thumbnails