studies

いろいろ勉強用備忘録的な感じ

短いことは良いことだ(ほかの人に理解させるつもりがないのなら)

昨日本屋に行って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で割り切れない場合は、&&以降の条件式を参照しない。マイナーケースから検討していく前者に比べて、メジャーケースから検討する後者のほうが理にかなっている)。

短くなった。
でも、もはや簡単には何をやっているかわからんだろう。
しかし、その暗号っぽさが面白くて愉快である。