ひたすら読みにくいCコード
「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");}
最近のエントリ
- 日本のIPv6採用状況が50%を超えている件について
- 「ピアリング戦記」の英訳版EPUBを無料配布します!
- IPv4アドレス移転の売買価格推移および移転組織ランキング100
- 例示用IPv6アドレス 3fff::/20 が新たに追加
- ShowNet 2024のL2L3
- ShowNet 2024 ローカル5G
過去記事