回答:
入力はセットです。出力はリストのリストです。
f=lambda a:[p+[x]for x in a for p in f(a-{x})]or[[]]
これは、組み込みですべての作業を行う答えよりも短いです。
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の順列は、1つの巨大な配列に次々と詰め込まれています。
<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)
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=[]){
代わりに 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]}
...入力として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]の順列、[1,2]の順列、[1,2,3]の順列などの順列としての整数のみ)。インデックスの作成とリストの作成。これは、タイプXのすべてのリストに対して適切にコンパイルされているように見えることに注意する必要があります。
(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
á
これはぶつかり、Japtの回答がなかったため、先に進んで1つ追加すると思いました。á
配列に適用され、引数なしで「すべての順列を取得する」ための組み込みです。-R
インタプリタリンクで使用されるフラグは、結果のみが印刷される方法を変更します。
œ
入力は配列/リストでなければなりません。
説明:
œ //Takes all the permutations of the elements in the top of the stack (the input is a list, so it would work)
Erik the Outgolferのおかげでバイトを節約できました