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
In PowerShell v3 wurde das -Unique
Flag für das Sort-Object
Cmdlet eingeführt, sodass es einige Bytes kürzer ist als die Version unter v2, da dies nicht erforderlich ist Select
.
v2 version, 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
In PowerShell sind keine Permutationen integriert, daher habe ich meinen Code von Prime Factors Buddies ausgeliehen und ihn für die Verwendung hier leicht optimiert.
Dies sind im Wesentlichen drei Teile, auf die ich im Folgenden näher eingehen werde.
param([char[]]$x)$a,$b=$x;$a=,$a
Nimmt Eingaben auf $x
, char
wandelt sie als -array um, entfernt den ersten Buchstaben $a
und den Rest $b
und setzt sie dann $a
mit dem Komma-Operator als Array um.
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}
Durchläuft die verbleibenden Buchstaben ( $b
), wobei jede Iteration den nächsten Buchstaben aufnimmt $z
und in die verbleibenden Buchstaben speichert und diese $b
dann in einem Array auf $a
das Ergebnis des Sendens $a
in einer eigenen Schleife verkettet - jedes Element von $a
(temporär gespeichert in $c
) wird durchlaufen seine eigene .length
, und dann $z
wird in jeder Position eingefügt, einschließlich Voranstellen und Anhängen mit $z$c
und $c$z
. Zum Beispiel für $c = '12'
und $z = '3'
wird dies dazu führen , '132','312','123'
in wird verketteten zurück $a
.
Der letzte Teil $a|?{$_.length-eq$x.count}|select -u|sort
nimmt jedes Element von $a
und verwendet eine Where-Object
Klausel, um nur diejenigen herauszufiltern, die die gleiche Länge wie die Eingabezeichenfolge haben, dann select
nur die -u
Nique-Elemente und schließlich sort
diese alphabetisch. Die resultierenden Zeichenfolgen verbleiben alle in der Pipeline und werden implizit Write-Output
nach Programmabschluss ausgegeben .
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"]
?