Windows PowerShellでProject Euler(5) パイプ

Problem 1

この問題はPythonではこう書くのが普通だと思います。

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

これに近い書き方を考えましょう。

Measure-Object

和を取るにはMeasure-Objectを使います。

1..999 | Measure-Object -Sum

こう出力されます。

Count    : 999
Average  :
Sum      : 499500
Maximum  :
Minimum  :
Property :

パイプから1, 2, ... , 999が順に流れてきます。Measure-Objectはそれを集計します。ここでは-Sumというオプションをつけているので、合計を計算します。表示は上のようになっていますが、生成されるのはGenericMeasureInfoというオブジェクトのようです。そして、これを表示するとCountとSumプロパティに値が入っているのでこのような表示になる、ということのようです。ですから、合計値のみ取り出したい場合は、

(1..999 | Measure-Object -Sum).Sum

と書きます。
略してこうも書けます。

(1..999 | measure -sum).sum

データが左でsumが右に来るのはPythonばかり書いている者からすると気持ち悪いですが、この言語はそういうものだということで慣れるしかないですね。

Where-Object

Where-Objectは要するにフィルタです。

1..10 | where { $_ % 2 -eq 0 }
2
4
6
8
10

whereのあとの{ … }はスクリプトブロックといいます。要するにラムダですね。引数を$_で受けるところはPerlそっくりですね。

まとめると次のようになります。

$n = 1000
(1..($n-1) | where { $_ % 3 -eq 0 -or $_ % 5 -eq 0 } | measure -sum).sum