Best painting tool

最高のお絵かきツール

受賞者:Michael Birken

引用元:https://www.ioccc.org/2013/birken/birken.c

審査員・作者による説明:https://www.ioccc.org/2013/birken/hint.html

動作

テトリスで絵を描く。

$ gcc -o birken birken.c

$ ./birken < examples/ioccc.txt

すごい勢いで自動プレイが進み、積み上がっていって、絵が作り上げられていく。

テトリスのパーツによって絵を描いている
図:テトリスのパーツによって絵を描いている
描き上がった様子
図:描き上がった様子

元のファイルは次の通り。

$ cat examples/ioccc.txt
4 1111111111177 4
      11177
4     11177     4
      11177
4     11177     4
  1111111111177
4               4
  1111111111177
4 111177 111177 4
  111177 111177
4 111177 111177 4
  1111111111177
4               4
  1111111111177
4 1177          4
  1177
4 1177          4
  1111111111177
4               4
  1111111111177
4 1177          4
  1177
4 1177          4
  1111111111177
4               4
  1111111111177
4 1177          4
  1177
4 1177          4
  1111111111177
4               4

他にもレイアウトファイルがたくさん添付されている。

解説

L型、J型、T型のブロックのはみ出したところで1ドットを描く。 残った部分は行を埋めて消す。 下にブロックがないところには単純には置けないので、一旦足場を作って1行分を描き、最後に足場を消すということもする。 動きのパターンはあらかじめ計算していて、文字列リテラルで埋め込まれている。

L型、J型、T型の3色しか描けない。 ファミコン時代のゲームのキャラクター(通常3色+透明色の4色)を描くのが目標だったので十分とのこと。 横幅も16ドットの絵を描けるよう、21列になっている。 足場などのために左右の2列の空きが必要で、20列では消せない(1ドット分を除くと、消すべきブロックが奇数個になってしまう)ので、もう1列ふやしたとのこと。

コード形状はテトリス風。 T型ブロックを選んだのは、テトリスのT。 過去のIOCCC作品には四角いコードが多くあったので、それを作る寸前の状態を表現したとのこと。

変数名はint T,e,t,r,i,sや、int E,L,O,R,G(テトリスの版権を持っていたソ連の外国貿易協会)、D,V,K(ソ連のPDP-11互換機)など。

この年から導入されたコードサイズ測定ツールのiocccsizeのバグをついている。 char*_ = "'""/*";と、文字列中にコメント開始を入れることで、その後が全部スキップされるので、8バイトと測定されるということ。 なお、審査員自身が次のように書けば0バイトになることを指摘している。

/* *\
/....

審査員のコメントでは、テトリスは計算複雑性の研究からPTSDの治療までいろいろ使われているので、お絵かきはすばらしいアイデアだろう、とのこと。