Best layout

最高のレイアウト

受賞者:Brian Westley

引用元:https://www.ioccc.org/1988/westley.c

審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1988/westley.hint

動作

円周率を計算する。

$ gcc -traditional-cpp -o westley westley.c

$ ./westley
3.141

解説

円の形状のコードで円周率を計算する。IOCCCの中ではかなり有名な作品。westleyの2作目。

1行目の_-_-_-_は次のように展開される。

-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;

ひとつめだけ-F<00||--F-OO--、ふたつめ以降は--F<00||--F-OO--になっているところがポイント(先頭のマイナスの数が違う)。 このコードの実行中、Fはゼロか負になっている。 よって、ひとつめでは-F<0は偽となり、--F-OO--が実行されてともに1ずつ減る。 ふたつめ以降は、--F<0が真となるので、--F-OO--は実行されない。 ただし、条件式のほうでFが1減ることに注意。

まとめるとこの1行は、OOを1減らし、Fをアンダースコアの数(≒横幅)だけ減らす効果がある。

コード全体としては、OOは行数だけ減るので、コードが描く円の直径(に-1をかけたもの)に相当する。 また、Fが減る量は円の面積(に-1をかけたもの)に相当する。 よって、円の面積の公式により、(-OO/2) * (-OO/2) * π ≒ -Fと言える。 このプログラムは4 * F / OO / OOを計算することで、円周率を出力している。

OO00と紛らわしくなっており、FOOメタ構文変数にかけていると思われる。

westley.hintにあるように、オリジナルのコードを動かすには

#define _ -a
-_

--aと解釈するコンパイラが必要。 -traditional-cppをつければコンパイルできるが、この問題が解決されたwestley.fix.cも用意されている。