답변:
(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.@!@#
3 개의 동사를 사용하여 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[]=[[]]
대신 2 바이트를 절약하면서 기본 사례로 작성할 수 있습니다 .
f=->x{p *x.permutation}
예를 들어 f[[1,2,3]]
이것을 출력합니다 .
하지만 사용하는 [].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에 대한 포인터를 반환합니다! 하나의 거대한 배열로 차례로 포장 된 a의 순열.
<malloc.h> isn't needed (ignore the warnings).
sizeof n`는 4입니다 (이동성은 좋지만 짧을수록 좋습니다). 추가 매개 변수를 변수로 사용하십시오 (예 :) p(n,a,N,i)
. int*p(..)int*a,o;
. 매개 변수 및 반환 값 대신 전역 변수를 사용하면 도움이되는 경우가 많습니다.
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)
import itertools
list(itertools.permutations("123"))
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=[]){
대신 다음을 수행하여 8 바이트를 얻을 수 있다고 생각합니다. 대신 js function p(s,a,c,i,z){if(!z)a=c="",z=[]
from itertools import*;lambda x:list(permutations(x))
해결책
prm
설명:
다음 내장 47 바이트 기능에 대한 3 바이트 내장 단축키입니다 .
{[x]{[x]$[x;,/x ,''o'x ^/:x;,x]}@$[-8>@x;!x;x]}
... 입력으로 정수 목록을 얻는다는 것을 알면 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 덕분에 바이트 절약