[C][IOCCC] The 24th IOCCC: Most Overlooked Obfuscation

衝撃的な問題作。まずはこの動画をご覧ください。あなたの常識が崩れるはず。

何の呪いでしょうか。

自分で試してみたい人のコピペ用。

wget http://ioccc.org/2015/endoh2/prog.c
cat prog.c
gcc -w -o prog prog.c
./prog

ネタバレ解説

バックスペース文字の悪用です。コードを 20 文字程度書き、そこからバックスペース文字でカーソルを左に戻し、また 20 文字程度コードを書く、というのを繰り返す感じのプログラムになっています。バックスペースは普通の ASCII 文字なので、valid な C 言語プログラムが含んでいいのです。

こういうネタは初期の IOCCC でいかにも既出な気がしたので全チェックしたんですが、意外にも見つからなかったので出しました。賞名のとおり、「見逃されていた難読化」ですね。

ちなみに動画の最後でもデモしてますが、less で prog.c を見ると Hello, world! に下線が表示されます。

$ less prog.c

タイプライタ・プリンタ時代に使われていた、overstrike(重ね打ち)と言われる技法のなごりが less に実装されているためです。詳しくは拙著『あなたの知らない超絶技巧プログラミングの世界』の付録 263 ページには載っていますので、よければどうぞ。(宣伝)

戦略と狙い

超絶技巧プログラミング本の付録には、ASCII コード表が載っています。なぜかというと、子供のころ N88-BASIC のユーザマニュアルの付録に載っていた ASCII コード表が大好きだったので、本を書くことになったとき、ASCII コード表は絶対載せたい!と思ったからです。

でまあ載せたのですが、せっかくだから、超絶技巧プログラミングで使えそうな制御文字について補足を書こうと思いました。そのとき、だいぶ前に man が強調文字を overstrike で書いてることを思い出したんです。なのでバックスペースについて書きました。

そのときは overstrike をネタにすることしか考えていなかったんですが、IOCCC 向けにネタを考えたとき、バックスペース自体がおもしろいと気づきました。それにフォーカスして作ったのがこれです。

もともと最初作ったのは、「"Hello, world!" と書かれているけど実行すると "Good-bye, world!" と出るプログラム」だったんですが、最近の IOCCC は一発ネタの通りにくいので、ひよって Quine にしておきました。完全純粋一発ネタの垂直方向ツーライナーがあえなく落選したことを考えると、正しい判断だったと思います。