ひたすら読みにくいCコード

   このエントリをはてなブックマークに登録    2007/1/12

The International Obfuscated C Code Contest」という面白いコンテストがあります。 1984年から行われているこのコンテストは、どれだけ読みにくいC言語プログラムを書けるか競うものです。 wikipediaでは、以下のように説明されています。

IOCCCとは「The International Obfuscated C Code Contest(国際邪悪なCコードコンテスト)」の略称。汚く読みづらいC言語コードをあえて書き、その汚さを競うというC言語ハッカーの奇祭である。むろんただ汚ければよいというわけではなく、目にした瞬間のインパクト、実行結果の美しさなど、さまざまな要因でアーティスティックなものが選ばれる。多くのコードはそもそも全くC言語に見えない。コード全体がアスキーアートになっているものなどが典型的である。
第一回大会は1984年に行われ、以降ほぼ年一回のペースで入賞者が発表されている。Perl作者のラリー・ウォールなどが有名。

ここでは、IOCCCの受賞作品から個人的に好きなのをいくつか紹介してみたいと思います。 1984年が第1回だけあって、ここで紹介する受賞作品以外にもかなりの数の面白い作品があります。

なお、今年もコンテストが開催されています。 2006年12月31日〜2007年2月28日23:59(UTC)が応募期間のようです。


迷路(1985年)


#define P(X)j=write(1,X,1)
#define C 39
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N,
*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0;
s<4;s++)if((k=m[s]+g)>=0&&k<C*R&&l[s]!=k%C&&(!M[k]||!j&&c>=16!=M[k]>=16))a[f++
]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=j<f?f:j;f+=c&-16*!j;M[g]=
c|1<<s;M[*d++=e]=f|1<<(s+2)%4;}else e=d>b++?b[-1]:e;}P(" ");for(s=C;--s;P("_")
)P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2
);}

出力結果


  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| |  _ _  |  _ _   _ _ _   _  |_  |  _  |   |  _  |  _ _|  _ _ _ _   _|  _ _  |
|  _|   |_ _|    _ _|  _|  _|_ _ _|_ _| | |_ _ _| |_ _ _ _|  _ _ _ _  | | |  _|
|  _ _| |   | |_|   | |  _|  _ _   _ _ _| | |  _ _| |  _ _ _| |  _ _|_ _|  _ _|
|   | | | |_|_  | |_ _|_  | | |  _|  _ _ _|_ _| | | |_  |  _ _|_  |  _  | |   |
| | | | |_ _  | |_ _  | |_ _| |_ _ _| |   |_  | | | |  _| |   | |_ _| | | | |_|
| | | | |  _ _|_  |  _|  _ _ _ _ _ _  |_|_   _  | | |_ _ _| |_ _ _  | | | |_  |
|_|_ _| | | |   | | |  _|  _ _|   | |_  |_ _ _|_  |   | |   |_ _  | | | | | | |
|  _    | |_ _|_ _|_ _|  _| |  _|_ _| |_  | |   |_ _|_  | |_ _ _ _| | |  _|   |
|_ _| | |_  | |   |  _  |  _ _|  _  |  _ _| | |  _ _|  _|_|   |   |_  |_ _ _| |
|_    |_  | |_ _| |_ _| |_ _  |_  | | |  _ _ _|_ _ _ _|_   _|_ _| | |_  |  _ _|
|  _|_ _| |_   _ _ _   _|   | |  _| | |_  |  _ _|  _ _   _|  _ _ _|  _ _|_ _  |
| |  _|  _|_ _|  _ _| |  _| | | |   | |  _ _|  _ _|  _ _  | |_ _ _  |_   _ _| |
| |_  | |  _  |_ _  | |_  | |  _| |_| | |_ _ _|   |_  |_  | |  _ _ _  |_ _  | |
|   | |  _|  _|   | | |  _| | | |   | | |  _ _ _|_  |_|  _| |_|  _  |_   _ _  |
| | | |_|  _|   |_ _| |_  |_|  _|_| | |   |  _ _ _ _  | |  _   _|_ _ _ _  | | |
| | |_  |   | |_    |  _ _|  _|   |_ _|_| | | |  _  | | |_|  _|  _ _   _ _|  _|
| | |  _|_| |_  | |_| |  _ _ _| |_| |   |_| |  _|_ _|_  | |_  | |  _ _| |  _| |
| | | |  _ _|  _|_ _ _ _|     | |  _| |_ _ _| |  _ _  | |_ _ _| |_  |  _ _|  _|
| | |_ _|  _ _ _ _ _   _| | | |   | |_ _|   | |_  |  _| |  _ _ _|   |_ _  | | |
| |_ _ _  |  _ _    |_ _ _| |_| |_ _ _  |_|_    | | |  _|_ _ _  | | |  _| |_  |
| |  _  |_| |  _| |_ _ _  |_  |_ _ _  | |   | | | | |_|    _  |_| | |_  |_    |
|_ _ _|_ _ _|_ _ _ _ _ _|_ _|_ _ _ _ _|_ _|_ _|_ _|_ _ _|_ _|_ _ _|_ _|_ _ _| |


電車(1986年)


                                                   extern int
                                                       errno
                                                         ;char
                                                            grrr
                             ;main(                           r,
  argv, argc )            int    argc                           ,
   r        ;           char *argv[];{int                     P( );
#define x  int i,       j,cc[4];printf("      choo choo\n"     ) ;
x  ;if    (P(  !        i              )        |  cc[  !      j ]
&  P(j    )>2  ?        j              :        i  ){*  argv[i++ +!-i]
;              for    (i=              0;;    i++                   );
_exit(argv[argc- 2    / cc[1*argc]|-1<<4 ]    ) ;printf("%d",P(""));}}
  P  (    a  )   char a   ;  {    a  ;   while(    a  >      "  B   "
  /* -    by E            ricM    arsh             all-      */);    }


出力結果



      choo choo



Hello World (1986年)

C言語、f77、/bin/sh で動作するプログラム。 「Hello world!」と出力する。



cat =13 /*/ >/dev/null 2>&1; echo "Hello, world!"; exit
*
*  This program works under cc, f77, and /bin/sh.
*
*/; main() {
      write(
cat-~-cat
     /*,'(
*/
     ,"Hello, world!"
     ,
cat); putchar(~-~-~-cat); } /*
     ,)')
      end
*/



世界一短いであろうCコード(1987年)



P;


「なんじゃこりゃ?」と思わず言いたくなってしまう作品です。 種はコンパイルオプションにあります。 例えば、ファイル名がfile.cだった場合、以下のようにコンパイルします。


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"  file.c


凄いinclude(1988)



#include "/dev/tty"


「。。。。」と言いたくなってしまうCコードです。 この作品のMakefileによると、このコードをコンパイルした直後に以下のようなキー入力をして、最後にCntl-Dを押してくださいと書いてあります。


main()
{
	printf("Hello world\n");
}


C、シェル、Makefile (2000年)



#include <stdio.h>
#define  true

true /*:all

CC=cc
PROG=tomx

false :
	make -f $0 $1
	exit 0

all: $(PROG)

%:%.c
	$(CC) $< -o $@

clean:
	rm $(PROG)

.PHONY: /* true clean */
	int main() {return!printf("Hello, world\n");}


   このエントリをはてなブックマークに登録