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
-array, ตัดตัวอักษรตัวแรกเข้า$a
และส่วนที่เหลือเข้าไป$b
, จากนั้น recasts $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
ถูกแทรกเข้าไปในทุกตำแหน่งรวมทั้ง prepending และต่อท้ายด้วยและ$z$c
$c$z
ตัวอย่างเช่นสำหรับ$c = '12'
และ$z = '3'
นี้จะส่งผลให้ถูกตัดแบ่งกลับเข้ามา'132','312','123'
$a
ส่วนสุดท้าย$a|?{$_.length-eq$x.count}|select -u|sort
ใช้องค์ประกอบแต่ละส่วน$a
และใช้Where-Object
ส่วนคำสั่งเพื่อกรองเฉพาะส่วนที่มีความยาวเท่ากันกับสตริงป้อนเข้าจากนั้นเลือกselect
เฉพาะ-u
รายการsort
ที่ไม่ซ้ำกันและสุดท้ายจะเรียงตามลำดับตัวอักษร สตริงผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตผ่านทาง implicit 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"]
หรือไม่