C#でProject Euler(1) はじめの一歩

例えば、Problem 1ですが、Pythonでふつうに書くとこうでしょう。

N = 1000
print sum(n for n in xrange(1, N) if n % 3 == 0 or n % 5 == 0)

実質1行で書けます。

しかし、Pythonは書きやすいけど遅いんですよね。C++の200倍くらい遅いことがあります。PyPyで動かすとたいてい3〜8倍速くなりますが、それでも非常に厳しい問題でごり押ししたいときはC++で書き直すことになります。

ここで問題が。C++Javaは確かに速いのですが、Pythonを翻訳しにくいです。例えば、上のようなコードを書くのは難しいです。Javaならこんな感じでしょうか。

public class e001 {
    public static void main(String args[]) {
        int s = 0;
        int N = 1000;
        for(int n = 1; n < N; ++n) {
            if(n % 3 == 0 || n % 5 == 0)
                s += n;
        }
        System.out.println(s);
    }
}

手続き型で書かなければなりません(将来のJavaならそうでもないらしい)。
しかし、C#ならPythonをほとんどそのまま翻訳できます。そして、C++Javaとそれほど変わらない速度を出すこともできます。
これは、Pythonで遅くてどうしようもないとき、C#に翻訳するための講座です。

インストール

この辺からVisual Studio Express 2012 for Windows Desktopをインストールします。C#のバージョンは5.0らしいです。

コンパイル

そして、次のように書いて拡張子.csで保存します。

// e001.cs
using System;

class e001 {
    static void Main(string[] args) {
        int s = 0;
        int N = 1000;
        for(int n = 1; n < N; ++n) {
            if(n % 3 == 0 || n % 5 == 0)
                s += n;
        }
        
        Console.WriteLine(s);
    }
}

ほぼJavaですね。しかし、Javaと同じように見えるのは今回限りです。

VS2012の開発者コマンド プロンプトを立ち上げて、

>csc 001.cs

と打ちます。cscコンパイラです。そうすると、e001.exeという実行ファイルが作成されます。