Best of show

最優秀賞

受賞者:Mauro Persano

引用元:https://www.ioccc.org/2005/persano/persano.c

審査員・作者による説明:https://www.ioccc.org/2005/persano/hint.text

動作

トーラス結び目のアニメGIFを生成する。

$ gcc -o persano persano.c -lm

$ ./persano 5 2 > knot5-2.gif
........................................
(5,2)型のトーラス結び目
図:(5,2)型のトーラス結び目

解説

./persano p qで(p,q)型トーラス結び目の画像を生成する。 (p,q)型トーラス結び目とは、ドーナツ形状(トーラス)の穴の周りをp周しつつ、ドーナツの断面方向にq周して元の位置に戻るときの軌跡のような形。

生成されるGIFはLZW圧縮をしていないとのこと。 無圧縮GIFのようなフォーマットになっていると思われる。

コード形状は”S^3”。4次元空間における3次元球面のこと。 typedef double V[3],U[4]で、3次元と4次元のベクトルの型を定義している(詳細な計算方法は解読していない)。

バイナリを標準出力に吐き出すので、テキストモードがあるシステムでは動かない。 作者は「今日にそんな環境を使っている人はいないので些細な問題 ;)」と言っているが、Windowsのことを指している。


読者の演習問題が3つある。

  1. ポリゴンを増やしてスムーズにせよ(1点)
  2. チューブの断面の半径を変える方法を示せ(2点)
  3. 有名な超越数の定数、πの位置を示せ(5点)

問1の答え:#define H 20の数字を変えれば良い。 審査員が冒頭で./persano 3 16 > knot3-16.gifを例にあげているが、これはデフォルトのHでは小さすぎておかしくなる。

(3,16)型のトーラス結び目(粗すぎて生成失敗)
図:(3,16)型のトーラス結び目(粗すぎて生成失敗)

#define H 100とした結果がこちら。

(3,16)型のトーラス結び目(きちんと生成できた)
図:(3,16)型のトーラス結び目(きちんと生成できた)

問2の答え:sr = 15sr = 5などとすれば細くなる。./persano 5 2の例。

(5,2)型のトーラス結び目(細め)
図:(5,2)型のトーラス結び目(細め)

問3の答え:pow(25/log(36),4)/377が2πの近似値になっている。