Most Educational

もっとも教育的

受賞者:Adrian Mariano

引用元:https://www.ioccc.org/1992/adrian.c

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

動作

正規表現のかわりに有限状態機械を書くgrepコマンド。

たとえばこれは、t(h|c)(e|h)$に相当するステートマシン。(読み方は解説で)

$ cat adrian.grep.try
    <q0> t <q1> . <q0>
    <q1> hc <q2> t <q1> . <q0>
    <q2> eh [q3] t <q1> . <q0>
    [q3] t <q1> . <q0>

adrian.hintに適用すると、thetchで終わる行だけが列挙される。

$ gcc -o adrian adrian.c

$ ./adrian adrian.grep.try < adrian.hint
    indicated by the appropriate rule.  This process is repeated until the
    string is consumed.  If the current state at this point is one of the
    possible input character at each state.  To simplify descriptions of the
    the '.' character matches any character if it occurs first in the
    The new file now contains all lines which match
    examples that appear above, and from, which is used to emulate the

解説

次の1行で、「状態stateにいるときに、chars1のどれかの文字を読んだら状態dest1へ、chars2のどれかの文字を読んだら状態dest2へ遷移せよ」という規則を表す。

       state chars1 dest1 chars2 dest2 ...

よって前記のadrian.grep.tryは、

という意味になっている。]で終わる状態は受理状態として扱われる。 (なお、添付のadrian.grep.tryは最後の規則が[q3] . <q1>になっていて、たとえばthexheなんかにもマッチしてしまうので、バグだと思う)

ここからが本題。 adrian.cはそれ自身が状態機械の記述になっている。 ファイル先頭のコメントに/* . wc . */とあるが、これは初期状態/*で何か文字を読んだら状態wcに行く、という意味になっている。 状態wcから記述は82行目にwc |C ==o[o[C] .e] .というのがある。以下省略するが、この状態機械でadrian.c自身をgrepすると、wcのコードがでてくる。

$ ./adrian adrian.c < adrian.c > wc.c

$ gcc -o wc wc.c

$ ./wc adrian.hint
    227   1108   7587

そして、埋め込まれているコードはwcだけではない。 /* . wc . *//* . echo| . */と書き換えることでecho相当のコードが得られる。 他に、head、basename、sleepが埋め込まれているとのこと。 それぞれの得方はadrian.hintを参照のこと。 headは比較的、grepの条件が読みやすいので読んでみるとよい(Wがある行を出力する、という程度)。

これぞIOCCC、という風情の作品。