短いことは良いことだ(ほかの人に理解させるつもりがないのなら)
昨日本屋に行ってperlの本を買ってきた。
perlは文字列の処理が得意なプログラミング言語らしい。
Cみたいにコンパイルしたりせずに、シェルから直接起動することができるから便利そう。
最近はソースコードやスクリプトをいかに短く書くことができるか、ということを考えている。
if文もfor文も直感的でわかりやすいけど、長くなってしまいがちだ。
短く書けたらプロっぽい気がする。
たとえば、今までうるう年を判定する関数は、こんな感じに書いていた。
bool isLeapYear(int year) { if (year%4) { return false; } else if (year%100) { return true; } else if (year%400) { return false; } else { return true; } }
この関数を翻訳すると、こうなる。
4で割り切れないなら、うるう年でない。
4で割り切れて、100で割り切れないなら、うるう年だ。
4で割り切れて、100でも割り切れて、400で割り切れないなら、うるう年でない。
4で割り切れて、100でも割り切れて、400でも割り切れるなら、うるう年だ。
うーむ、わかりやすい。
けど、まあそこそこ長い。
そこで、これを一行で済ませてしまう書き方を考えるわけである。
次のようになる。
bool isLeapYear(int year) { return !( year%400 && !(year%100) || year%4 ); }
または、同じことだけれども、
bool isLeapYear(int year) { return !(year%4) && ( year%100 || !(year%400) ); }
とも書ける(ドモルガンの法則で、この二つは双対である。)
コンピュータの処理的にif文バージョンと同じで効率がいいのは、後者のほうだろう。
(4で割り切れない場合は、&&以降の条件式を参照しない。マイナーケースから検討していく前者に比べて、メジャーケースから検討する後者のほうが理にかなっている)。
短くなった。
でも、もはや簡単には何をやっているかわからんだろう。
しかし、その暗号っぽさが面白くて愉快である。