Best abuse of the C preprocessor

Cプリプロセッサの最高の悪用

受賞者:Immanuel Herrmann

引用元:https://www.ioccc.org/2001/herrmann1.c

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

動作

Cプリプロセッサを使ったチューリングマシン。

しかし、古いCプリプロセッサの挙動に依存しており、現代の環境では動作確認できていない。

解説

#define Q(x, y) x ## y

Q(/, *)

/*が作れることを期待しているが、gcc -traditional-cppでも間にスペースが入ってしまうので動かない。 gcc 2.95で動作確認したらしいので、このgccをビルドすれば動作確認できるかもしれない。

なお、Cプリプロセッサ自体は有限状態しか扱えないのでチューリング完全ではないが、原始再帰関数程度の表現力はあるので、繰り返し適用する前提をおけば計算可能関数(チューリング完全)になれる。


当時のOS環境であるDebian 2.2 (potato)をQEMUで動かしたところ、とりあえず動作確認できた。 ./herrmann1.sh 'prg=herrmann1.times2'を実行した例。 Iの数を2倍にする

初期状態:Iが8本ある
図:初期状態:Iが8本ある
計算中
図:計算中
終了状態:Iが16本になった
図:終了状態:Iが16本になった

左端にOをはさみ、その位置を右に1つずつずらすたびに、Iを左端に余分につけたす、というような動きで2倍にしていった。