任务
您的目标(应该选择接受)是编写一个程序,给定输入字符串(或字符数组),输出该字符串中字母的所有可能排列。我对自己的输出不满意,因此应按字母顺序排序,没有重复。
例:
输入: buzz
输出:
buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub
规则
- 这是代码高尔夫球,因此最短的代码获胜。
- 每行上的尾随空格都可以
- 最后一行之后可以有一个换行符(但不能再有其他换行符)
N*
至p
):-)
您的目标(应该选择接受)是编写一个程序,给定输入字符串(或字符数组),输出该字符串中字母的所有可能排列。我对自己的输出不满意,因此应按字母顺序排序,没有重复。
例:
输入: buzz
输出:
buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub
N*
至p
):-)
Answers:
感谢@EriktheOutgolfer的更正(q
而不是r
)
qe!N*
q e# Read input as a string
e! e# Unique permutations, sorted
N* e# Join by newline. Implicitly display
jS{.p
j Join. Implictly joins on newlines.
S Sort
{ Uniquify
.p All permutations, implicitly run on input.
S
真的需要?
/:~@~.@:{~!@#A.&i.#
f =: /:~@~.@:{~!@#A.&i.#
f 'buzz'
buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub
这是4列火车:
/- ~ --- /:
/- @ -^- ~.
/- ~ --- @: -^- {
|
| /- !
--< /- @ --^- #
| |
\-----< /- A.
>- & --^- i.
\- #
基本上:
/:~@~.@:{~!@#A.&i.#
! A.& get permutations
@# i.# of range (0..length)
{~ map indices to chars in string
@: then
~. unique
@ then
/:~ sort
[:~.i.@!@#A./:~
应该为您节省一些字节
from itertools import*;lambda i:'\n'.join(sorted({*map(''.join,permutations(i))}))
真的......当一个最长的答案是48个字节...... 81个字节的叹息。好吧,我将尽我所能尝试这种高尔夫,但是高尔夫技巧仍然非常值得赞赏。
另外,这是我可以在Python 2中以86个字节获得的最短的解决方案:
from itertools import*;lambda f:'\n'.join(sorted({''.join(i)for i in permutations(f)}))
显然在Python 2中,[*...]
返回一个Syntax Error
,并且由于permutations
return itertools.permutations object at 0x...
,提取唯一排列的下一个最短方法(我知道)是使用{''.join(i)for i in permutations(f)}
where f
是输入字符串。
最后,请注意,这些都是lambda函数,因此必须以format调用print(<Function Name>(<Input String>))
。
字符串作为输入
*.comb.permutations.sort».join.squish.map: *.put
输入字符列表
*.permutations.sort».join.squish.map: *.put
*\ # Whatever lambda
# .comb\ # split into a list of characters
.permutations\ # returns a list of lists
.sort\
».join\ # join the second level lists
.squish\ # remove adjacent repeated values
.map: *.put # print each on its own line
#perl6
频道上运行Perl 6代码。
».say
代替.map: *.put
».say
可以按任何顺序执行,而有一次是故意将其按顺序进行。
现在排序!
import itertools as i
for a in sorted(set(i.permutations(input()))):print("".join(a))
from itertools import*
而不是import itertools as i
。您可以替换i.permutations
为来保存一个字节permutations
。
{*...}
而不是set(...)
可以节省两个字节。
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
剥离$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
and Where-Object
子句的每个元素,以仅过滤出与输入字符串长度相同的那些,然后select
仅输入-u
nique项,最后sort
按字母顺序对它们进行过滤。结果字符串将全部留在管道上,并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
|select -u|sort
为|sort -u
。可以肯定的是2.0没有那个。
import java.util.*;class M{public static void main(String[]a){for(Object s:p(new TreeSet(),"",a[0]))System.out.println(s);}static Set p(Set l,String p,String s){int n=s.length(),i=0;if(n>1)for(;i<n;p(l,p+s.charAt(i),s.substring(0,i)+s.substring(++i,n)));else if(!l.contains(p+=s))l.add(p);return l;}}
取消测试代码:
import java.util.*;
class M{
static Set p(Set l, String p, String s){
int n = s.length(),
i = 0;
if(n > 1){
for(; i < n; p(l, p + s.charAt(i), s.substring(0, i) + s.substring(++i, n)));
} else if(!l.contains(p+=s)){
l.add(p);
}
return l;
}
public static void main(String[] a){
for(Object s : p(new TreeSet(), "", a[0])){
System.out.println(s);
}
}
}
输入:测试
输出:
estt
etst
etts
sett
stet
stte
test
tets
tset
tste
ttes
ttse
(sort(remove-duplicates(map list->string(permutations(string->list s)))) string<?)
取消高尔夫:
(define(f s)
(sort
(remove-duplicates
(map
list->string
(permutations
(string->list s))))
string<?))
测试:
(f "buzz")
输出:
'("buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub")
解:
?x@<x@:prm@#x:
说明:
使用内置的置换功能prm
生成输入长度的置换,将这些置换应用于输入,按字母顺序排序,然后采用不同的值。
?x@<x@:prm@#x: / the solution
x: / store input as x
# / count length of x
prm@ / apply (@) function prm
x@: / apply indices to x and save result back into x
< / indices to sort ascending
x@ / apply to x
? / take distint
["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]
吗?