Worst Abuse of the C Preprocessor

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

受賞者:Brian Westley

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

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

動作

普通に実行しても何もしない。

$ gcc westley.c -DO -o westley

$ ./westley

オプション無しでビルドするとエラーが出る。 端末の横幅を80文字にしておくとよい。

$ gcc westley.c
westley.c:87:10: fatal error:
 You are in a debris-filled
  dungeon; a door bars the
  way, and sludge trickles into
  a floor drain

 : No such file or directory
...

エラーメッセージが「あなたはほこりだらけのダンジョンにいる。ドアは開かない。汚水が排水口にしたたっている。」となっている。

ダンジョンで行動をするには、コンパイルオプションの-Dから始まるコマンドを使う。 ドア(Door)を説明させる(Describe)例。

$ gcc -Describe -Door westley.c
westley.c:36:10: fatal error:
 The door is decorated with relief
  figures of various dog breeds

 : No such file or directory
...

「ドアは様々な種類の犬のレリーフで装飾されている」

ダンジョンを脱出できたら成功。

解説

コードは比較的単純な#ifdefの羅列。 メッセージは#include " ... message ... "とすることで存在しないファイル読み込みを行ってエラー表示につなげている。

マクロを定義するコンパイルオプションの-Dをフル活用しているので、出てくるアイテム(名詞)もコマンド(動詞)もすべてDで始まる名前になっている。


この記事はネタバレなので、westley.hintに書いてある攻略の実行結果をすべて置いておく。

$ gcc -Describe -Drain westley.c
westley.c:39:10: fatal error:
 Through the drain you see a dwarf
 in another cell
...

排水口を説明せよ:「排水口を覗くと、他の部屋にドワーフがいるのが見える」

$ gcc westley.c -Describe -Dwarf
westley.c:42:10: fatal error:
 The gnarled dwarf looks thirsty
...

ドワーフを説明せよ:「ふしくれだったドワーフはのどが渇いているようだ」

$ gcc westley.c -Describe -Debris
westley.c:45:10: fatal error:
 You notice a desk, a phone, and
  a phone directory among the clutter
...

ほこりを説明せよ:「とっちらかっている中に、机と電話、電話帳がある」

$ gcc westley.c -Describe -Desk
westley.c:48:10: fatal error:
 There are some dimes on the desk
...

机を説明せよ:「机の上に10セント硬貨(ダイム)が数枚ある」

$ gcc westley.c -Describe -Dime
westley.c:53:10: fatal error:
 You notice nothing unusual
...

10セント硬貨を説明せよ:「とくに変わったところはない」

$ gcc westley.c -Describe -Directory
westley.c:51:10: fatal error:
 It reads:
      Pixie's Pub -
     instant service -
     Dial DUNgeon0614
...

電話帳を説明せよ:「『ピクシーの酒場 - インスタントサービス - DUNgeon0614に電話してください』と書かれている」

$ gcc westley.c -Dial -DUNgeon0614
westley.c:63:10: fatal error:
 Pixie takes your order, and
 magically, the room is filled
  with banana daiquiris
...

DUNgeon0614に電話をかけよ:「ピクシーが注文を取ると、部屋は魔法のようにバナナダイキリで満たされた」

$ gcc westley.c -Drop -Daiquiri
westley.c:72:10: fatal error:
 You drop the drink
  on the floor
...

ダイキリを落とせ:「あなたは飲み物を床に捨てた」

$ gcc westley.c -Drop -Dwarf -Daiquiri
westley.c:70:10: fatal error:
 The dwarf eagerly accepts
  the drink.  'Thanks!  Here,
  I found this, but I can't
 understand it.'  He hands
 you a document
...

ダイキリをドワーフに落とせ:「ドワーフは待ちに待っていたと飲み物を受け取った。『ありがとう!これを見つけたんだ。何なのかわからないが』ドワーフは文書をあなたに渡した」

$ gcc westley.c -Describe -Document
westley.c:33:10: fatal error:
 It reads:
      Depress Dotted Dog
...

文書を説明せよ:「『ブチ柄の犬を押せ』と書いてある」

$ gcc westley.c -Depress -Dotted -Dog
westley.c:85:10: fatal error:
 Be more specific
...

ブチ柄の犬を押せ:「具体的に言ってください」

$ gcc westley.c -Depress -Dalmatian
westley.c:76:10: fatal error:
 As you press the dalmatian
  figure, the door opens - only
  to reveal a menacing orc by
 a vending machine (with a
 sign reading 'DEPOSIT MONEY')
...

ダルメシアンを押せ:「ダルメシアンのレリーフを押すと、ドアが開いた - おそろしいオークがあらわれた。そばに自動販売機がある(『金を預けよ』という看板もある)」

$ gcc westley.c -Deposit -Dime
westley.c:79:10: fatal error:
 Donuts spill out; you get
  some, the orc hungrily eats
  the rest
...

10セント硬貨を預けよ:「ドーナツがこぼれ出た。あなたはいくつか拾い、残りはオークが貪るように食べた」

$ gcc westley.c -Drop -Donut
westley.c:82:10: fatal error:
 The orc quickly eats the
  donut; he still bars the
  way
...

ドーナツを落とせ:「オークはすばやくドーナツを食べた。オークはまだ通せん坊をしている」

$ gcc westley.c -Drop -Donut -Down -Drain
westley.c:29:10: fatal error:
 The orc scrambles to the drain,
  trying to get the donut; you
  run out the door and escape!

               The End
...

ドーナツを排水管に流せ:「オークはドーナツをとろうと排水口にとびついた。あなたはドアを飛び出し逃げ出した!終わり」