Best One Liner

最高のワンライナー

受賞者:Brian Westley

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

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

動作

見た目を設定できる時計。 実行には、コマンドライン引数でテンプレートを与える必要がある。

westleyを実行するシェルスクリプトが3つ添付されている。 clock1は柱時計。 13:00過ぎに実行した例。

$ gcc -m32 -o westley westley.c

$ ./clock1

 -<<==O==>>-
--====v====--
|     .     |
|      *    |
|           |
|     0     |
|           |
|           |
|           |
=============
  \       /
   \     /
   |     |
   |  |  |
   |  |  |
   |  |  |
   |  |  |
   |  O  |
   |     |
)-----------(
|           |
=============

clock2は逆向きに進む置き時計。

$ ./clock2

   )-=*=-(
--===-=-===--
)     x     (
|    X      |
|           |
|     0     |
|           |
|           |
)           (
]]==-----==[[
   )  |  (
 -----------

clock3はゲージ表示。

$ ./clock3

..3..6..9..12 Hours
|
   |
 ----.----10---.----20---.----30---.----40---.----50---.---- Minutes

clock1からclock3は./westleyを引数付きで呼び出すスクリプトになっている。westley自身のコマンドライン引数の意味は次の通り。

解説

これがたった92バイトで実現されているのには心を動かされる。

localtimeの返り値の時と分をマップデータで引いて、テンプレート中のその位置に指定されたマークを置く、というのが極めて簡潔に実現されている。 localtime()の返すstruct tm*int*とみなして時と分を読み出している。 argcが初期状態で5なので、argc/=2をループの条件とすることで、2、1となる。 2はlocaltime()の返り値であるstruct tmの3番目のフィールド、つまりtm_hourに対応する。 1は2番目のフィールド、つまりtm_minに対応する。 実に巧妙。

localtimeが返すポインタを暗黙的にintとして扱うので、-m32が必要。 プロトタイプ宣言int *localtime();を足すのでもよい。