PowerShell v3 +, 171 bytes
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 introdujo el -Unique
indicador en el Sort-Object
cmdlet, por lo que es unos pocos bytes más corto que la versión v2 a continuación, ya que no necesitamos Select
primero.
Versión v2, 178 bytes:
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 no tiene permutaciones integradas, por lo que tomé prestado mi código de Prime Factors Buddies y lo modifiqué ligeramente para usarlo aquí.
Esto es esencialmente tres porciones, que ampliaré a continuación.
param([char[]]$x)$a,$b=$x;$a=,$a
Toma la entrada $x
, la char
convierte como una matriz, elimina la primera letra $a
y el resto $b
, y luego la vuelve a proyectar $a
como una matriz con el operador de coma.
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}
Recorre las letras restantes ( $b
), cada iteración toma la siguiente letra y la almacena $z
y la deja dentro $b
, luego concatena la matriz en $a
el resultado del envío$a
través de su propio bucle: cada elemento de $a
(almacenado temporalmente $c
) se repite propio .length
, y luego $z
se inserta en cada posición, incluso anteponer y anexar con $z$c
y $c$z
. Por ejemplo, para $c = '12'
y $z = '3'
, esto dará como resultado que '132','312','123'
se concatenen nuevamente $a
.
La parte final $a|?{$_.length-eq$x.count}|select -u|sort
toma cada elemento de $a
y usa la Where-Object
cláusula para filtrar solo aquellos que tienen la misma longitud que la cadena de entrada, luegoselect
solo los -u
elementos nique y finalmente sort
los alfabéticamente. Todas las cadenas resultantes se dejan en la tubería, y la salida a través de lo implícito Write-Output
ocurre al finalizar el programa.
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"]
?