この問題は本当は一瞬で解けるのですが、あえて順列を出します。PowerShellの関数はほとんどジェネレータなので、Pythonのように再帰で簡単にpermutationsを書くことができます。その中で
foreach($c in permutations $b) { ,(@($h) + $c) }
こう書くと頭の数字が変わるまでの計算をまとめて行って配列を生成するのですが、
permutations $b | foreach { ,(@($h) + $_) }
と書くと、配列を一つずつ生成するようです。あと、
Pythonでは部分配列を取るときにa[:k] + a[k+1:]とすればいいのですが、PowerShellは基本的に1..3なら1, 2, 3なので場合分けが必要になるようです。とにかくうまく書けません。
sliceはPythonのisliceと同じつもりです。
22分かかりました。
function slice($start, $stop) { begin { $i = 0 } process { if($i -ge $stop) { $a = 0; 1 / $a } elseif($i -ge $start) { ,$_ } ++$i } } function permutations($a) { if($a.length -eq 1) { ,$a } else { $n = $a.length foreach($k in 0..($n-1)) { $h = $a[$k] if($k -eq 0) { $b = $a[1..($n-1)] } elseif($k -eq $n - 1) { $b = $a[0..($n-2)] } else { $b = $a[0..($k-1)+($k+1)..($n-1)] } permutations $b | foreach { ,(@($h) + $_) } # foreach($c in permutations $b) { # ,(@($h) + $c) # } } } } $watch = New-Object System.Diagnostics.Stopwatch $watch.Start(); $n = 1000000 permutations (0..9) | slice ($n - 1) $n | foreach { $_ -join "" } $watch.Stop(); $watch.Elapsed.TotalMilliSeconds / 1000 trap { continue }