WisdomSoft - for your serial experiences.

偶数・奇数の判定関数の作り方

某所に寄せられていた質問「偶数/奇数の判定」にて、投稿者が提示したコードがあまりにもアレな感じで話題になっていたので、この問題に挑戦してみました。ただのネタ投稿なので、良い子の皆は真似しないように。

計算方法がわからなければ、計算しなければいいじゃない!

事の発端は OKWave という質問投稿サイトに寄せられたコーディングに関する質問「偶数/奇数の判定」というものです。2006年に投稿された質問らしいのですが、最近 Twitter で話題になったので緊急提案することにしました。

元の質問は、入力された整数(符号の扱いに関しては説明がなかったので、この場では自然数とする)が偶数なのか奇数なのかを判定するモジュールを作っているが、より良い方法はないかというものです。その程度のコーディングが仕事になるのかというツッコミは置いておくとして、話題になったのは投稿者が書き込んだ次のコードです。

Public Function a(b)
  Select Case b
    Case 1
      a = True
    Case 2
      a = False
    Case 3
      a = True
    Case 4
      a = False
     :
    (中略)
     :
    Case 10000
      a = False
  End Select
End Function

常人には決して思いつかない、思いついたとしても書こうとはしないだろう異次元のコーディング技術に驚愕します。入力に対応する結果が有限なら、ビルドタイムに想定されるあらゆる結果を埋め込んでしまえばよいのです。つまり、このコードは暗にメタプログラミングやジェネリックプログラミングを示唆しているのだよ!(な、なんだってー!!)

で、もし僕がこの質問に回答するなら、どう答えるかを考えてみました。自分で書いて確認するから効率が悪いのです。コードは、コードに生成してもらいましょう。テキストを出力できるプログラミング言語であれば何でもよいのですが、この場ではブラウザの中で動かしたいので JavaScript を使います。

コード1
function CreateCode(max)
{
	var r = "Public Function a(b)\n  Select Case b\n";
	var value = true;
	
	for(var i = 1 ; i <= max ; i++)
	{
		r += "    Case " + i + "\n";
		r += "      a = " + (value ? "True\n" : "False\n");
		value = !value;
	}
	
	r += "  End Select\nEnd Function";
	return r;
}

コード1の CreateCode() 関数は max パラメータに指定した自然数までの範囲で、上記の投稿者が提示したパターンでコードを文字列として生成します。投稿者のコードによれば Case 10000 まで書いたらしいので、それがどのくらいのコード量なのか確認できます。

以下にコード1の CreateCode() 関数の結果を表示します。

コード2
上の入力ボックスに 1 以上の整数を入力して「生成」ボタンを押してください。

例えば、最大値が 10,000 程度までであれば問題ありませんが、最大値が 100,000 を超えると非常に重たくなり、より大きな値を指定してスクリプトが応答不能になると、ブラウザがスクリプトを停止します。

投稿者は整数の範囲を提示していませんでしたが、符号無し 32 ビット整数の全ての領域を生成するとなると、出力されるコードはテキストファイルで 90 GB (空白文字含む)を超える容量になります。なるほど、手入力だと連日の深夜作業になること間違いありません。

とまぁ、Twitter で上の質問が話題になっていたのでネタにしてみましたが、実はコードを生成するコード(ツール)を書くというのは珍しいことでもなく、場合によっては生産性を向上させる良い手段になります。古くは COM の IDL からコードを生成する MIDL ツールなど、宣言的なテキストから実装を生成するというパターンは実用的です。

コード生成の話とは別に、特定の数列やパターンを繰り返したコードをサクっと作りたいことってあるんですよね。例えば XAML や SVG のような XML による図の宣言において幾何学的な表現が求められた場合、デザイナを使って整形するのは効率が悪く、アルゴリズムで生成したいことがあります。一時的な(再利用しない)用途でコード1のようなコード生成マクロを作るのは面倒です。このような場合は Excel などの表計算ソフトウェアを使うと便利です。

図1 表計算を使ったパターン生成
図1 表計算を使ったパターン生成

図1のような状態にしてB1~D9の範囲を選択した状態でオートフィル機能(右下の点にカーソルを合わせて「+」になった状態で下方向にドラッグする)を使うことで、この手のパターン化されたコードを簡単に生成できたりします。ビジネス系のツールを使う機会の少ないポジションにいる開発者だと、意外とこうした抜け道に気が付かなかったりするので、テクニックとして覚えておくとよいでしょう。

489100455X, 4891004568, 4873113636