The International Obfuscated C Code Contest – 国際わかりにくいC言語プログラムコンテスト
Code Readingという本を読んでいて、「The International Obfuscated C Code Contest」という面白いコンテストの存在を知りました。
どんなコンテスト?
直訳すると「国際わかりにくいC言語プログラムコンテスト」。
コンテストの目的がホームページに掲載されていたので訳してみました。
- 以下のルールに則って、一番不明瞭でわかりにくいC言語プログラムを書く
- 皮肉的な方法で、プログラミングスタイルの重要性を示すこと
- 普通じゃないコードでCコンパイラに負荷をかけること。
- ある種のC言語の緻密さ・巧妙さを示すこと
- 残念なC言語プログラムのための議論の場を提供すること
あえて理解しにくいコードを書くことによって、適切なプログラミングスタイルに則ってコードを書くことの重要性を世に広める、ということが主な目的のようです。
(ジョーク的な意味合いも強いのかも)
わかりにくいプログラムって?
具体的にわかりにくいプログラムってどういうものなのでしょうか?
歴代のコンテスト勝者のコードが以下のページからダウンロードできますので、その中から2000年度大会の勝者の一人「Glyn Anderson」さんのコードを例としてあげてみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <stdio.h> char *T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s", K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;X(){r [r [r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x& 7) -1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g =J ),x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2 +( x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A ,1 ][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l () );}B(){*J&&B((D=*J,Q[2]<D&&D<k[1]&&(*g++=1 ), !(D-W&&D-9&&D-10&&D-13)&&(!*r&&(*g++=0) ,* r=1)||64<D&&D<91&&(*r=0,*g++=D-63)||D >= 97&&D<123&&(*r=0,*g++=D-95)||!(D-k[ 3] )&&(*r=0,*g++=12)||D>k[3]&&D<=k[ 1] -1&&(*r=0,*g++=D-47),J++));}j( ){ putchar(A);}b(){(j(A=(*K)[D* W+ r[2]*Y+x]),++x<Y)&&b();}t () {(j((b(D=q[g],x=0),A=W) ), ++q<(*(r+1)<Y?*(r+1): Y) )&&t();}R(){(A=(t( q= 0),'\n'),j(),++r [2 ]<N)&&R();}O() {( j((r[2]=0,R( )) ),r[1]-=q) && O(g-=-q) ;} C(){( J= gets (K [1]))&&C((B(g=K[2]),*r=!(!*r&&(*g++=0)),(*r)[r]=g-K[2],g=K[2 ],r[ 1]&& O()) );;} main (){C ((l( (J=( A=0) [K], A[M] =(F= (k=( M[!A ]=(Q =T+( q=(Y =(W= 32)- (N=4 )))) +N)+ 2)+7 )+7) ),Y= N<<( *r=! -A)) );;} |
うん、まずはきれいに整形することから始めないとですね!
リファクタリングの基本!
まとめ
2006年から2007年にかけて行われた第19回大会を最後に開催されていないみたいですが、完全になくなってしまったわけではなく、今後も開催される可能性がありそうだとのこと。
Code Readingにも書いてありましたが、上記のようなコードをわかりやすくリファクタリングしていくことによって、自分自身のリファクタリング力のトレーニングになりそうですね!
うーん、世の中には面白いことがたくさんあるなぁ。
それでは!








