PowerShell v3 +、171バイト
param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|sort -u
PowerShell v3ではコマンドレットに-Unique
フラグが導入されたSort-Object
ため、Select
最初に行う必要がないため、以下のv2バージョンよりも数バイト短くなっています。
v2バージョン、178バイト:
param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|select -u|sort
PowerShellには組み込みの置換がないため、Prime Factors Buddiesからコードを借用し、ここで使用するために少し調整しました。
これは基本的に3つの部分であり、以下で詳しく説明します。
param([char[]]$x)$a,$b=$x;$a=,$a
入力を受け取り$x
、-array としてキャストchar
し、最初の文字を$a
に、残りを$b
にストリップしてから$a
、カンマ演算子を使用して配列として再キャストします。
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}
残りの文字($b
)をループし、各反復で次の文字を取得して格納し$z
、残りをに残して、独自のループを介して送信$b
し$a
た結果に配列連結し$a
ます- $a
(一時的に格納される$c
)の各項目がループされます独自の.length
、および$z
を先頭および末尾に追加する$z$c
など、すべての位置に挿入され$c$z
ます。たとえば、$c = '12'
との$z = '3'
場合、これは'132','312','123'
に連結して戻され$a
ます。
最後の部分で$a|?{$_.length-eq$x.count}|select -u|sort
は、の各要素を$a
使用し、Where-Object
句を使用して入力文字列と同じ長さの要素のみをフィルターで除外しselect
、-u
niqueの項目のみを最後にsort
アルファベット順に並べます。結果の文字列はすべてパイプラインに残り、暗黙的な出力Write-Output
はプログラムの完了時に発生します。
PS C:\Tools\Scripts\golfing> .\alphabetically-permute-a-string.ps1 'PPCG'
CGPP
CPGP
CPPG
GCPP
GPCP
GPPC
PCGP
PCPG
PGCP
PGPC
PPCG
PPGC
["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]
?