引用元:https://www.ioccc.org/1998/bas2.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1998/bas2.hint
動作
IOCCCのプログラムサイズのルールにしたがってテキストの文字数カウントをする。
$ gcc -o bas2 bas2.c
$ echo "foo" | ./baz2
3
$ echo "{ ; }" | ./baz2
0
$ echo "x{x;x}x" | ./baz2
7
解説
この年のIOCCCのプログラムサイズのルールは、「作品は3217バイト以下であること。また、空白以外の文字の数は1536個以下であること(ただし;
か{
か}
で、その後に空白文字が来るものはカウントしない)」となっている。
この後半のカウントをするプログラムとなっている。
;
と{
と}
と空白(スペース、タブ、改行)を区別するやり方が賢しい。
ビットマップのテーブルを用意し、文字のビットごとにマスクをとることでこれらの文字と他の文字を区別している(普通に比較を6つ並べたほうがコードは短くなる予感はするけど、これも味か)。
なお、このプログラムは更に改ページ文字(\f
)も空白扱いにしているように見える。
IOCCCのルールには書かれていないので、ここはずれが生じている(bas2.hintで審査員も指摘している)。