引用元:https://www.ioccc.org/1992/imc.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1992/imc.hint
動作
マンデルブロ集合。画像での表示とテキストでの表示がある。
画像での表示は、Sun Rasterという、いにしえのフォーマットで出力される。
しかもx86だとヘッダがリトルエンディアンで出てしまうので、ビッグエンディアンに直す必要がある。
直したあとは、imagemagickを使えばpngなどに変換できる。
端的には、次のように実行すればよい。
$ gcc -m32 -o imc imc.c
$ ./imc | ruby -e 'print $<.read.unpack("N8C*").pack("V8C*")' > tmp.sun
$ convert tmp.sun tmp.png
次のようにコマンドラインオプションをつけると、テキストで表示される。
$ ./imc -text
.** ************ ** * * * **** * ***** **
.** *********** *** ** * ***** **** **
.* ********** **** * * ** ***** *
.* ********* ****** * * **** *
.******** ** ** ** * ***** *
.***** * * ** *** ** ***** *
. ** ** ** * *** ** *****
.** ***** ** ** *****
.* ****** * * * *****
. * * * * * * *****
. * ** **** * *****
. * * *****
. * ** **** * *****
. * * * * * * *****
.* ****** * * * *****
.** ***** ** ** *****
. ** ** ** * *** ** *****
.***** * * ** *** ** ***** *
.******** ** ** ** * ***** *
.* ********* ****** * * **** *
.* ********** **** * * ** ***** *
.** *********** *** ** * ***** **** **
.** ************ ** * * * **** * ***** **
解説
プログラム側でエンディアンを直したければ、プログラムの中頃にある0x59A66A95,256,192,1,6912,1,0,0
というヘッダデータのエンディアンを反転させて次のようにすれば修正できると思う。
しかし長くなってしまい、意匠が壊れるのでパッチは避けた。
h[]={2506794585,65536,3221225472,16777216,1769472,16777216,0,0}
コマンドラインオプションが結構充実していて、描画位置やサイズを変更できたり、ジュリア集合もかけたりする。
詳しくはimc.hint参照。
hintの中でおすすめされているコマンドの出力は次の通り。
$ ./imc -s 512,512 -f 600000 -l 512 -m 16 -c.00805,.74274 | ruby -e 'print $<.read.unpack("N8C*").pack("V8C*")' > tmp2.sun
$ convert tmp2.sun tmp2.png
$ ./imc -s512,512 -j-.523,-.535 | ruby -e 'print $<.read.unpack("N8C*").pack("V8C*")' > tmp3.sun
$ convert tmp3.sun tmp3.png
ここまでマンデルブロ集合がなかったのはちょっと意外。
発見が1978年で流行が1980年代中頃らしい。