Windows PowerShellでProject Euler(24) 連想配列

Problem 17

コードを分かりやすくするために1 => "one", 2 => "two", ...という連想配列を作っておきます。
連想配列は次のように作ります。

$pt = @{ x = 1; y = 2 }
$pt
Name                           Value
----                           -----
y                              2
x                              1

個々にアクセスする方法は、

$pt.x       # 1
$pt["y"]    # 2

と二通りあります。JavaScriptと同じですね。

$words = @{ 1 = "one"; 2 = "two"; 3 = "three"; 4 = "four";
            5 = "five"; 6 = "six"; 7 = "seven"; 8 = "eight";
            9 = "nine"; 10 = "ten"; 11 = "eleven"; 12 = "twelve";
            13 = "thirteen"; 14 = "fourteen"; 15 = "fifteen";
            16 = "sixteen"; 17 = "seventeen"; 18 = "eighteen";
            19 = "nineteen"; 20 = "twenty"; 30 = "thirty";
            40 = "forty"; 50 = "fifty"; 60 = "sixty";
            70 = "seventy"; 80 = "eighty"; 90 = "ninety";
            100 = "hundred"; 1000 = "thousand" }

function f($n) {
    if($n -eq 0) {
        0
    }
    elseif($n -le 20) {
        $words[$n].length
    }
    elseif($n -lt 100) {
        $r = $n % 10
        $words[$n-$r].length + (f $r)
    }
    elseif($n -lt 1000) {
        $r = $n % 100
        $q = ($n - $r) / 100
        if($r -eq 0) {
            $words[$q].length + $words[100].length
        }
        else {
            $words[$q].length + $words[100].length + 3 + (f $r)
        }
    }
    else {
        $r = $n % 1000
        $q = ($n - $r) / 1000
        if($r -eq 0) {
            $words[$q].length + $words[1000].length
        }
        else {
            $words[$q].length + $words[1000].length + (f $r)
        }
    }
}

$N = 1000
(1..$N | foreach { f $_ } | measure -sum).sum