C言語でいかに「わかりにくい」プログラムを書けるか の コンテスト

C言語の「まったく」役に立たない知識を教えます!! の解答と解説です。

((3-2)[a]-2)[b] = 5; の 5 は b[0] に入ります!。

で,解説ですが,C言語で a[1] は 1[a] と書けます。
配列 は 変数名と添字を入れ替えて書けるという,構文ルールがあります。
それを使うと
((3-2)[a]-2)[b] = 5;
の (3-2) は 1なので,
(1[a]-2)[b] = 5;
となり, 1[a] は a[1] となります。
(a[1]-2)[b] = 5;
で,a[1] は int a[2] = {1,2}; となっているので, a[0]は1で a[1]は2 です。だから
(2-2)[b] = 5;
となります。 2-2 を計算すれば 0 となり
(0)[b] = 5;
となります。 ( ) を取り除くと
0[b] = 5;
となり, 0[b] は b[0] と書けます。結果
b[0] = 5;
となり, 5は,b[0] に代入されます。

もちろん,プログラムはわかりやすく,読みやすく書くものです。
しかし,あえて,わかりにくく,読みにくくするコンテストがあります。

それがこちら:
 C言語でいかに「わかりにくい」プログラムを書けるか の コンテスト:
IOCCC(The International Obfuscated C Code Contest)

みんな分かりにくいプログラムばかりです。
読みにくくするために,技術力を使いすぎです(笑)。

たとえば,過去の作品(1984年から2004年まで)
http://www.ioccc.org/years.html

これらの中の
なんとか.c
をいろいろ開いてみてください。

C言語でアスキーアートになっているものも結構あります。
たとえば

http://www.ioccc.org/1998/banks.orig.c
http://www.ioccc.org/2004/newbern.c
http://www.ioccc.org/2004/omoikane.c
http://www.ioccc.org/2000/bmeyer.c

などなど。
歴史あるコンテストですが,ほとんど遊びですね・・・。

参考:
http://www.geekpage.jp/blog/?id=2007/1/12
http://www.nwhite.info/nw5/2008/11/-ioccc.html

comments

コメントを残す