PowerShell v3 +, 171 byte
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 ha introdotto il -Uniqueflag suSort-Object cmdlet, quindi è più corto di alcuni byte rispetto alla versione v2 di seguito, poiché non è necessarioSelect prima.
versione v2, 178 byte:
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 non ha permutazioni integrate, quindi ho preso in prestito il mio codice Prime Factors Buddies e l'ho leggermente modificato per l'uso qui.
Si tratta essenzialmente di tre parti, che espanderò di seguito.
param([char[]]$x)$a,$b=$x;$a=,$aPrende l'input $x, lo lancia come un chararray, rimuove la prima lettera in $ae il resto in $b, quindi si ripete $acome array con l'operatore virgola.
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Passa attraverso le lettere rimanenti ( $b), ogni iterazione prende la lettera successiva e la memorizza in $ze lasciando la rimanente $b, quindi si concatena in $aserie sul risultato dell'invio $aattraverso il proprio ciclo - ogni elemento di $a(temporaneamente memorizzato in $c) viene ripetuto proprio .length, e quindi $zviene inserito in ogni posizione, incluso anteporre e aggiungere con $z$ce $c$z. Ad esempio, per $c = '12'e $z = '3', ciò comporterà di '132','312','123'essere nuovamente concatenato in $a.
La parte finale $a|?{$_.length-eq$x.count}|select -u|sortprende ogni elemento $ae usa la Where-Objectclausola per filtrare solo quelli che hanno la stessa lunghezza della stringa di input, quindi selectsolo gli -uelementi di nicchia e infine sortquelli alfabetici. Le stringhe risultanti vengono lasciate tutte sulla pipeline e l'output tramite implicito Write-Outputavviene al completamento del programma.
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"]?