PowerShell v3 +, 171 bajtów
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
Program PowerShell v3 wprowadził -Unique
flagę w Sort-Object
cmdletu, więc jest o kilka bajtów krótszy niż wersja v2 poniżej, ponieważ nie musimy tego robić Select
najpierw.
wersja v2, 178 bajtów:
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 nie ma żadnych wbudowanych permutacji, więc pożyczyłem swój kod od znajomych Factor i nieco go poprawiłem, aby używał go tutaj.
To w zasadzie trzy części, które rozwinę poniżej.
param([char[]]$x)$a,$b=$x;$a=,$a
Pobiera dane wejściowe $x
, rzuca je jako char
tablicę, usuwa pierwszą literę do, $a
a resztę do $b
, a następnie przekształca $a
jako tablicę z operatorem przecinkowym.
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}
Pętle przechodzą przez pozostałe litery ( $b
), każda iteracja bierze kolejną literę i przechowuje ją do $z
pozostałych $b
, a następnie pozostawia w , a następnie konkatenuje tablicę $a
z wynikiem wysłania $a
przez własną pętlę - każdy element $a
(tymczasowo przechowywany w $c
) jest zapętlany jest własny .length
, a następnie $z
jest wstawiany w każdą pozycję, w tym poprzedzanie i dołączanie za pomocą $z$c
i $c$z
. Na przykład dla $c = '12'
i $z = '3'
spowoduje '132','312','123'
to powrót do konkatenacji $a
.
Ostatnia część $a|?{$_.length-eq$x.count}|select -u|sort
bierze każdy element $a
i używa Where-Object
klauzuli, aby odfiltrować tylko te, które mają taką samą długość jak łańcuch wejściowy, a następnie select
s tylko -u
drobne elementy, a na końcu sort
te alfabetycznie. Wynikowe ciągi znaków są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnego mają Write-Output
miejsce po zakończeniu programu.
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"]
?