RustでProject Euler (3)

メソッドチェーン

この問題は、Pythonならこんな風に書きたいところでしょう。

import sys

n = int(sys.argv[1])
s = sum(i for i in range(1, n) if i%3 == 0 or i%5 == 0)
print(s)

Rustではこういう書き方は無いようです。しかし、メソッドチェーンは使えます。

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    let n: i64 = args[1].parse().unwrap();
    let s: i64 = (1..n).filter(|&i| i % 3 == 0 || i % 5 == 0).sum();
    println!("{}", s);
}

filterの引数はclosureです。&を使っているのは、オブジェクトの所有権の移動はなくて、参照だからですね。この辺りは、また出てくると思います。

速度

速度を見てみましょう。

$ rustc -O e001b.rs
$ time ./e001b 1000000000
233333333166666668


real    0m1.352s
user    0m1.344s
sys     0m0.000s

少し遅いだけですね。