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、-uniqueの項目のみを最後に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"]?