PowerShellで総当り(改)

全件組み合わせてる部分の{}があまりにもというかイミフなので書き直してみました。


$solve = 1..5 | % { ( $baker = $_ ) } |
% { 1..5 } | % { ( $cooper = $_ ) } |
% { 1..5 } | % { ( $fletcher = $_ ) } |
% { 1..5 } | % { ( $miller = $_ ) } |
% { 1..5 } | % { ( $smith = $_ ) } |
これでいけるようでした。一番最初は % { ... | % { ... | % { ... } } } とかって全部ネストしてたんだけど、ブロックの中で変数に状態突っ込んでくんだったら、まったくネストしなくてもいける。というかむしろ、ブロックのネストが必要になるケースがわからん……、という感じ。
そして、ForEach-Object {} (Aliasを使うと % {})は無名フィルターに他ならん、とPowerShell インアクションに書いてあったのを思い出し、名前付きフィルターを使って書き直してみました。

$baker = $cooper = $fletcher = $miller = $smith = $null
filter lm([ref]$p) { ( $p.value = $_ ) }

$solve = 1..5 | lm ( [ref]$baker ) |
% { 1..5 } | lm ( [ref]$cooper ) |
% { 1..5 } | lm ( [ref]$fletcher ) |
% { 1..5 } | lm ( [ref]$miller ) |
% { 1..5 } | lm ( [ref]$smith ) |
foreach { , @($baker, $cooper, $fletcher, $miller, $smith) } |
where {
($_ | Select-Object -Unique).Count -eq 5 -and
$baker -ne 5 -and
$cooper -ne 1 -and
$fletcher -ne 1 -and $fletcher -ne 5 -and
$miller -gt $cooper -and
[Math]::Abs($smith - $fletcher) -ne 1 -and
[Math]::Abs($fletcher - $cooper) -ne 1
}

, $solve

値の代入が目的だと、filterに参照渡ししなければいけないので[ref]必須、参照渡しは存在する変数じゃないと駄目なので要冒頭での変数初期化、キャストの結合順序がびっくりするほど低い(っていうかこの状態で()がいるのは普通なのでしょうか……)ので結局()が必要、ということであまり見た目はすっきりしないけど、%{}が減ったんでぱっと見、割といい感じになったかなーと思う。