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 -Unique
flag 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=,$a
Prende l'input $x
, lo lancia come un char
array, rimuove la prima lettera in $a
e il resto in $b
, quindi si ripete $a
come 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 $z
e lasciando la rimanente $b
, quindi si concatena in $a
serie sul risultato dell'invio $a
attraverso il proprio ciclo - ogni elemento di $a
(temporaneamente memorizzato in $c
) viene ripetuto proprio .length
, e quindi $z
viene inserito in ogni posizione, incluso anteporre e aggiungere con $z$c
e $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|sort
prende ogni elemento $a
e usa la Where-Object
clausola per filtrare solo quelli che hanno la stessa lunghezza della stringa di input, quindi select
solo gli -u
elementi di nicchia e infine sort
quelli alfabetici. Le stringhe risultanti vengono lasciate tutte sulla pipeline e l'output tramite implicito Write-Output
avviene 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"]
?