今回は回文数の判定を行います。そのために配列の使い方を覚えます。
配列は次のように作成します。
$a = 3, 5, 7 $a[2] # 7
これでもOKです。
$a = @(3, 5, 7)
次のようにすると2次元配列のようになります。
$b = @(@(3, 4), @(5, 6)) $b[1][1] # 6
配列で気を付けなければいけないのは次のようなときです。
function g() {
@(1, 2)
3
}
filter f() {
$_.GetType()
}
g | f
filterはbegin, process, endの構文からprocessのみを残したようなものです。これを実行すると、
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Int32 System.ValueType True True Int32 System.ValueType True True Int32 System.ValueType
と配列が分解されて排出しまいます。配列を排出するなら、頭に「,」をつけます。
function g() {
,@(1, 2)
3
}
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array True True Int32 System.ValueType
ここでfoldを作りましょう。
function fold($f, $init) {
begin { $x = $init }
process { $x = & $f $x $_ }
end { $x }
}
1, 2, 3 | fold { $args[0] * 10 + $args[1] } 0
スクリプトブロックの$argsは引数の配列です。引数が複数の場合はこれを使います。スクリプトブロックを変数にしたとき&をつけると関数として使うことができます。これで回文数の判定ができます。
function fold($f, $init) {
begin { $x = $init }
process { $x = & $f $x $_ }
end { $x }
}
function digits($n) {
while($n -gt 0) {
$d = $n % 10
$d
$n = ($n - $d) / 10
}
}
function is_palindromic($n) {
$m = digits $n | fold { $args[0] * 10 + $args[1] } 0
$m -eq $n
}
is_palindromic 12321 # True
is_palindromic 12345 # False