Best Output

最高の出力

受賞者:Ian Collier

引用元: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
tmp.sun
図:tmp.sun

次のようにコマンドラインオプションをつけると、テキストで表示される。

$ ./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
tmp2.sun
図:tmp2.sun
$ ./imc -s512,512 -j-.523,-.535 | ruby -e 'print $<.read.unpack("N8C*").pack("V8C*")' > tmp3.sun

$ convert tmp3.sun tmp3.png
tmp3.sun
図:tmp3.sun

ここまでマンデルブロ集合がなかったのはちょっと意外。 発見が1978年で流行が1980年代中頃らしい。