PowerShell v3 +, 171 байт
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 представив -Unique
прапор на Sort-Object
cmdlet, тому він на кілька байтів коротший, ніж нижченаведена версія v2, оскільки нам не потрібноSelect
.
версія v2, 178 байт:
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 немає вбудованих перестановок, тому я запозичив свій код у Prime Factors Buddies і трохи підкоригував його для використання тут.
Це, по суті, три частини, які я розкрию нижче.
param([char[]]$x)$a,$b=$x;$a=,$a
Займає введення $x
, char
передає його як- масив, знімає першу букву в, $a
а решту - $b
, а потім переглядає $a
як масив із оператором коми.
while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}
Проведіть цикл через інші літери ( $b
), кожна ітерація приймає наступний лист і зберігає його в нього, $z
а решту залишає в ньому $b
, а потім об'єднує масив на $a
результат надсилання $a
через його власний цикл - кожен елемент $a
(тимчасово зберігається в $c
) перекидається на його власне .length
, а потім $z
вставляється у кожну позицію, включаючи попереднє додавання та додавання до $z$c
та $c$z
. Наприклад, для $c = '12'
і $z = '3'
, це призведе до '132','312','123'
об'єднання назад у $a
.
Кінцева частина $a|?{$_.length-eq$x.count}|select -u|sort
займає кожен елемент $a
та використовує Where-Object
пункт для фільтрації лише тих, які мають ту саму довжину, що і вхідна рядок, потім select
s лише -u
nique елементи і, нарешті, sort
s в алфавітному порядку. Отримані рядки залишаються на конвеєрі, а вихід через неявні Write-Output
відбувається після завершення програми.
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"]
?