引用元: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倍にする
左端にOをはさみ、その位置を右に1つずつずらすたびに、Iを左端に余分につけたす、というような動きで2倍にしていった。