Answers:
(i.@!@#A.[)
用法:
(i.@!@#A.[) 1 3 5
1 3 5
1 5 3
3 1 5
3 5 1
5 1 3
5 3 1
说明:
i.@!@#
使用三个动词返回从0到(!n)-1的列表,其中n是给定列表中的项数。
[
返回列表本身。在给出的示例中0 1 2 3 4 5 A. 1 3 5
。
A.
返回第一个列表中每个项目的第二个列表的可能排列(种类-在此给出了适当的解释)。
from itertools import*
p=lambda x:list(permutations(x))
p[]=[[]]
p l=[e:r|e<-l,r<-p$filter(/=e)l]
本质上与ugoren的解决方案相同,但Haskell的列表理解能力更好!
import Data.List
p=permutations
import Data.List
p[]=[[]]
p l=(\(l,(e:r))->map(e:)$p(l++r))=<<(init$zip(inits l)(tails l))
作为结果,当列表中有重复的元素时,此选项也适用。
p=Data.List.permutations
。不过,这感觉就像在作弊。同样,Data.List.permutations
不按字典顺序输出排列。
p[]=[[]]
为基本情况,节省两个字节。
f=->x{p *x.permutation}
例如f[[1,2,3]]
输出this。
但是使用[].permutation
感觉就像在作弊,所以:
f=->a{a.size<2?[a]:a.flat_map{|x|f[(a-x=[x])].map{|y|x+y}}}
经过测试
100.times.all?{arr=(1..99).to_a.sample(rand(5)); arr.permutation.to_a==f[arr]}
=> true
f(array) { return array.sort(); }
#define S t=*a;*a=a[i];a[i]=t;
#define R o=p(n,r-1,a+1,o,r-2,0)
int*p(n,r,a,o,i,t)int*a,*o;{if(!r)for(;n;--n)*o++=*--a;else{R;for(;i;--i){S R;S}}return o;}
P(n,a)int*a;{int N=1,i=n;for(;i;N*=i--);return p(n,n,a,malloc(N*n*8),n-1,0)-N*n;}
函数P(n,a)返回一个指向n!的指针!一个排列的排列,一个接一个地排列在一起。
<malloc.h> isn't needed (ignore the warnings).
sizeof n`为4(可移植性很好,但更短则更好)。使用额外的参数作为变量(例如p(n,a,N,i)
)。int*p(..)int*a,o;
。使用全局变量代替参数和返回值通常会有所帮助。
{x@v@&((#x;1)~^=:)'v:!(#x)##x}
没有内置功能!
def p(s:Seq[_])=s.permutations
def c(x:Int,t:List[_]):List[_]={val l=t.size
val o=x%l
if(l>1){val r=c(x/l,t.tail)
r.take(o):::(t.head::r.drop(o))}else
t}
def p(y:List[_])=(0 to(1 to y.size).product).foreach(z=>println(c(z,y)))
val y=List(0,1,2,3)
p(y)
class P[A](val l:Seq[A])extends Iterator[Seq[A]]{
var c=0
val s=(1 to l.size).product
def g(c:Int,t:List[A]):List[A]={
val n=t.size
val o=c%n
if(n>1){val r=g(c/n,t.tail)
r.take(o):::(t.head::r.drop(o))
}else
t}
def hasNext=c!=s
def next={c+=1
g(c-1,l.toList)}
}
for(e<-new P("golf"))println(e)
function p(s,a="",c="",i,z=[]){a+=c,i=s.length
!i?z.push(a):0
for(;i--;s.splice(i,0,c))p(s,a,c=s.splice(i,1),0,z);return z}
var perms = p([1,2,3]);
document.getElementById('output').innerHTML = perms.join("\n");
<pre id="output"></pre>
js function p(s,a="",c="",i,z=[]){
而不是 js function p(s,a,c,i,z){if(!z)a=c="",z=[]
解
prm
说明:
这是3个字节的内置快捷方式,用于以下内置 47字节的功能:
{[x]{[x]$[x;,/x ,''o'x ^/:x;,x]}@$[-8>@x;!x;x]}
...如果我们知道要获取一个int列表作为输入,则可以缩短为23个字节:
{$[x;,/x,''o'x^/:x;,x]} / golfed built in
{ } / lambda function with implicit input x
$[ ; ; ] / if[condition;true;false]
x / if x is not null...
x^/:x / x except (^) each-right (/:) x; create length-x combinations
o' / call self (o) with each of these
x,'' / x concatenated with each-each of these results (this is kinda magic to me)
,/ / flatten list
,x / otherwise enlist x (enlisted empty list)
p(a)==(#a=0=>[[]];r:=[[a.1]];r:=delete(r,1);n:=#a;m:=factorial n;m>1.E7=>r;b:=permutations n;for j in 1..m repeat(x:=b.j;r:=concat([a.(x.i)for i in 1..n],r));r)
不打高尔夫球
--Permutation of a
pmt(a)==
#a=0=>[[]]
r:=[[a.1]]; r:=delete(r,1) -- r has the type List List typeof(a)
n:=#a
m:=factorial n
m>1.E7=>r
b:=permutations(n) --one built in for permutation indices
for j in 1..m repeat
x:=b.j
r:=concat([a.(x.i) for i in 1..n],r)
r
所有这些都调用一个库函数,该函数给出索引的置换(仅整数作为[1]的置换,[1,2]的置换,[1,2,3]的置换等)。因此,获取这些集合就足够了索引并建立列表;必须注意,这似乎对每个X类型的List都适用
(4) -> p([1,2,3])
Compiling function p with type List PositiveInteger -> List List
PositiveInteger
(4) [[1,2,3],[1,3,2],[3,1,2],[2,1,3],[2,3,1],[3,2,1]]
Type: List List PositiveInteger
(5) -> p([x^2,y*x,y^2])
Compiling function p with type List Polynomial Integer -> List List
Polynomial Integer
(5)
2 2 2 2 2 2 2 2 2 2 2 2
[[x ,x y,y ],[x ,y ,x y],[y ,x ,x y],[x y,x ,y ],[x y,y ,x ],[y ,x y,x ]]
Type: List List Polynomial Integer
(6) -> p([sin(x),log(y)])
Compiling function p with type List Expression Integer -> List List
Expression Integer
(6) [[sin(x),log(y)],[log(y),sin(x)]]
Type: List List Expression Integer
(7) -> m:=p("abc")::List List Character
Compiling function p with type String -> Any
(7) [[a,b,c],[a,c,b],[c,a,b],[b,a,c],[b,c,a],[c,b,a]]
Type: List List Character
(8) -> [concat(map(x+->x::String, m.j)) for j in 1..#m]
(8) ["abc","acb","cab","bac","bca","cba"]
Type: List String
œ
输入必须是数组/列表。
说明:
œ //Takes all the permutations of the elements in the top of the stack (the input is a list, so it would work)
感谢Outgolfer的Erik节省了一个字节