枚举排列


17

给定一些正整数生成对象的所有排列。ññ

细节

  • 排列是没有固定点的排列。(这意味着在每个排列编号中,一世都不能位于第一世个条目中)。
  • 输出应包含数字1个2ñ(或01个2ñ-1个)的排列
  • 您也可以始终打印ññ-1个1个(或分别ñ-1个ñ-21个0)的排列,但必须指定。
  • 输出必须是确定性的,也就是说,每当调用某个给定ñ作为输入的程序时,输出都应该是相同的(这包括排列顺序必须保持相同),并且完整的输出必须在每次有限的时间(以概率1这样做是不够的)。
  • 您可以假设ñ2
  • 对于某些给定的您可以生成所有排列,也可以选择另一个整数作为索引并打印第个排列(按您选择的顺序)。ñķķ

例子

请注意,排列顺序不必与此处列出的顺序相同:

n=2: (2,1)
n=3: (2,3,1),(3,1,2)
n=4: (2,1,4,3),(2,3,4,1),(2,4,1,3), (3,1,4,2),(3,4,1,2),(3,4,2,1), (4,1,2,3),(4,3,1,2),(4,3,2,1)

OEIS A000166记录了排列的次数。


我们可以提交发电机吗?
Fatalize

@Fatalize是的,我认为这与上面提到的其他两种方法足够相似(或者您认为对此有很强的论点吗?)。
瑕疵的

1
@Fatalize实际上,默认情况下
瑕疵的

Answers:


7

果冻,6 个字节

Œ!=ÐṂR

单子链接接受一个正整数,该正整数产生一个整数列表。

在线尝试!

怎么样?

Œ!=ÐṂR - Link: integer, n
Œ!     - all permutations of (implicit range of [1..n])
     R - range of [1..n]
   ÐṂ  - filter keep those which are minimal by:
  =    -   equals? (vectorises)
       -   ... i.e. keep only those permutations that evaluate as [0,0,0,...,0]

5

Brachylog,9个字节

⟦kpiᶠ≠ᵐhᵐ

在线尝试!

这是一个生成器,输出[0, …, n-1]给定的一个排列n

如果将其包装在元ᶠ - findall谓词中,则生成器将生成所有可能的排列错位。

说明

⟦           The range [0, …, Input]
 k          Remove the last element
  p         Take a permutation of the range [0, …, Input - 1]
   iᶠ       Take all pair of Element-index: [[Elem0, 0],…,[ElemN-1, N-1]]
     ≠ᵐ     Each pair must contain different values
       hᵐ   The output is the head of each pair

5

JavaScript(V8),85字节

递归函数打印所有基于0的排列。

f=(n,p=[],i,k=n)=>k--?f(n,p,i,k,k^i&&!p.includes(k)&&f(n,[...p,k],-~i)):i^n||print(p)

在线尝试!

已评论

f = (                   // f is a recursive function taking:
  n,                    //   n   = input
  p = [],               //   p[] = current permutation
  i,                    //   i   = current position in the permutation
  k = n                 //   k   = next value to try
) =>                    //         (a decrementing counter initialized to n)
  k-- ?                 // decrement k; if it was not equal to 0:
    f(                  //   do a recursive call:
      n, p, i, k,       //     leave all parameters unchanged
      k ^ i &&          //     if k is not equal to the position
      !p.includes(k) && //     and k does not yet appear in p[]:
        f(              //       do another recursive call:
          n,            //         leave n unchanged
          [...p, k],    //         append k to p
          -~i           //         increment i
                        //         implicitly restart with k = n
        )               //       end of inner recursive call
    )                   //   end of outer recursive call
  :                     // else:
    i ^ n ||            //   if the derangement is complete:
      print(p)          //     print it


2

05AB1E,9个字节

Lœʒāø€Ë_P

在线尝试!

说明

L           # push [1 ... input]
 œ          # get all permutations of that list
  ʒ         # filter, keep only lists that satisfy
   āø       # elements zipped with their 1-based index
     €Ë_P   # are all not equal


2

Japt,8字节

从0开始

o á fÈe¦

尝试一下(页脚增加所有元素,以便与测试用例进行比较)

o á fÈe¦     :Implicit input of integer
o            :Range [0,input)
  á          :Permutations
    f        :Filter
     È       :By passing each through this function
      e      :  Every element of the permutation
       ¦     :  Does not equal its 0-based index

2

Python 2,102字节

lambda n:[p for p in permutations(range(n))if all(i-j for i,j in enumerate(p))]
from itertools import*

在线尝试!

基于0的索引,元组列表。

itertools基于解决方案:

Python 2,107个字节

n=input()
for i in range(n**n):
 t=[];c=1
 for j in range(n):c*=j!=i%n not in t;t+=[i%n];i/=n
 if c:print t

在线尝试!

基于0的索引,列表行,完整程序。

注意:此解决方案即使不导入该itertools库,也不会比导入该库的另一个解决方案长很多,因为这里的大部分内容都是在构建排列。排列检查实际上大约是另外7个字节!原因是检查是在每个排列构建过程中即时进行的。对于其他解决方案,情况并非如此,在该解决方案中,您必须检查该itertools.permutations函数返回的每个排列是否实际上是一种排列,当然,映射本身需要占用很多字节。


2

MATL,11个字节

:tY@tb-!AY)

这将按字典顺序生成所有排列。

在线尝试!

举例说明

考虑输入3

:     % Implicit input n. Range [1 2 ... n]
      % STACK: [1 2 3]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3]
Y@    % All permutations, in lexicographical order, as rows of a matrix
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 2 1]
b     % Bubble up: moves third-topmost element in stack to the top
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [1 2 3]
-     % Subtract, element-wise with broadcast
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [0 0 0; 0 1 -1; ··· ; 2 -1 -1; 2 0 -2]
!A    % True for rows containining only nonzero elements
      % STACK: [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [false false ··· true false]
Y)    % Use logical mask as a row index. Implicit display
      % STACK: [2 3 1; 3 1 2]



1

盖亚 10字节

┅f⟨:ċ=†ỵ⟩⁇

在线尝试!

┅		| push [1 2 ... n]
 f		| push permutations
  ⟨	⟩⁇	| filter where result of following is truthy
   :ċ		| dup, push [1 2 ... n]
     =†ỵ	| there is no fixed point

1

J,26个字节

i.(]#~0~:*/@(-|:))i.@!A.i.

在线尝试!

i. (] #~ 0 ~: */@(- |:)) i.@! A. i.
i. (                   )            NB. 0..input
   (                   ) i.@! A. i. NB. x A. y returns the
                                    NB. x-th perm of y
                                    NB. i.@! returns 
                                    NB. 0..input!. Combined
                                    NB. it produces all perms
                                    NB. of y
    ] #~ 0 ~: */@(- |:)             NB. those 2 are passed as
                                    NB. left and right args
                                    NB. to this
    ] #~                            NB. filter the right arg ]
                                    NB. (all perms) by:
         0 ~:                       NB. where 0 is not equal to...
              */@                   NB. the product of the 
                                    NB. rows of...
                 (- |:)             NB. the left arg minus
                                    NB. the transpose of
                                    NB. the right arg, which
                                    NB. will only contain 0
                                    NB. for perms that have
                                    NB. a fixed point

1

R81 80字节

function(n)unique(Filter(function(x)all(1:n%in%x&1:n-x),combn(rep(1:n,n),n,,F)))

在线尝试!

返回list包含所有排列的。产生的效率极低ñ2ñ可能的值是重复时间的大小n组合,然后过滤排列和排列。[1..n]n1:n%in%x1:n-x

R + gtools,62字节

function(n,y=gtools::permutations(n,n))y[!colSums(t(y)==1:n),]

在线尝试!

效率更高,返回a matrix,其中每一行都是一个排列。



1

C ++(GCC) 207个 196字节

-5个字节,上限为天花猫-6个字节,即罗马·奥戴斯基

#include<regex>
#define v std::vector
auto p(int n){v<v<int>>r;v<int>m(n);int i=n;for(;m[i]=--i;);w:for(;std::next_permutation(&m[0],&m[n]);r.push_back(m))for(i=n;i--;)if(m[i]==i)goto w;return r;}

在线尝试!


如果使用输出参数,则可以做得更好,特别是如果它是std :: array,因此它是预先设置的大小-145字节
罗马Odaisky

@RomanOdaisky:好主意,但是我如何理解代码规则,您必须将预分配代码纳入字节数。
movatica

@movatica一个灰色区域,我认为代码更有可能是有效的,而不是无效的。它将很高兴将正确的结果写在某个地方,这是调用者负责读取输出的责任。请注意,类似的STL算法std::copy也委托调用方为输出提供足够的空间。
罗曼·奥戴斯基

@RomanOdaisky:STL行为确实是有效的参数。
movatica

0

C ++(gcc),133字节

我认为这已经与其他提交内容有所不同,值得单独回答。最后是一种由index[array]内而外的语法!

#include<regex>
[](int n,auto&r){int i=n;for(;i[*r]=--i;);for(;std::next_permutation(*r,*r+n);)for(i=n;i--?(r[1][i]=i[*r])-i:!++r;);}

在线尝试!



0

Python 2,82字节

f=lambda n,i=0:i/n*[[]]or[[x]+l for l in f(n,i+1)for x in range(n)if~-(x in[i]+l)]

在线尝试!

88字节作为程序:

M=[],
r=range(input())
for i in r:M=[l+[x]for l in M for x in r if~-(x in[i]+l)]
print M

在线尝试!

使用itertools的93个字节:

from itertools import*
r=range(input())
print[p for p in permutations(r)if all(map(cmp,p,r))]

在线尝试!


0

Perl 6的49 37个字节

编辑:与Phil H来回往复后,我们将其缩减为仅37个字节:

(^*).permutations.grep:{all @_ Z-^@_}

在线尝试!

通过Whatever在开头使用,可以避免使用方括号(节省2个字符)。接下来使用Zmetaoperator与-该元用于获取置换的每个元素(例如2,3,1),并依次减去0,1,2。如果它们中的任何一个为0(虚假),则所有结点将失败。


原始的解决方案是(在线尝试!

{permutations($_).grep:{none (for $_ {$++==$_})}}

1
良好的开始,您可以使用Z = = -7个字节,使Z上的过滤器更短:tio.run/##K0gtyjH7n1upoJamYKvwv7ogtSi3tCSxJDM/…
Phil H

@PhilH我知道必须有一种集成zip运算符的方法,但我不太清楚。尼斯
user0721090601 '19

PhilH使用该策略,仍然可以通过杀死括号来消除
##

PhilH最后一个无效。对于所有除n = 2以外的所有元素,将拒绝仅一个元素
user0721090601 '19

当然,忘记了要求...已删除
Phil H

0

木炭44 28字节

划掉44仍然是常规44

NθIΦEXθθEθ﹪÷ιXθλθ⬤ι‹⁼μλ⁼¹№ιλ

在线尝试!链接是详细版本的代码。松散地基于@EricTheOutgolfer的non-itertools答案。说明:

Nθ                              Input `n`
     Xθθ                        `n` raised to power `n`
    E                           Mapped over implicit range
         θ                      `n`
        E                       Mapped over implicit range
            ι                   Outer loop index
           ÷                    Integer divided by
             Xθ                 `n` raised to power
               λ                Inner loop index
          ﹪     θ               Modulo `n`
   Φ                            Filtered where
                  ι             Current base conversion result
                 ⬤              All digits satisfy
                         №ιλ    Count of that digit
                       ⁼¹       Equals literal 1
                   ‹            And not
                    ⁼μλ         Digit equals its position
  I                             Cast to string
                                Implicitly print


0

Pyth,12个字节

f*F.e-bkT.PU

在线尝试!

           UQ # [implicit Q=input] range(0,Q)
         .P  Q# [implicit Q=input] all permutations of length Q
f             # filter that on lambda T:
   .e   T     #   enumerated map over T: lambda b (=element), k (=index):
     -bk      #     b-k
 *F           # multiply all together

过滤器的工作方式如下:如果任何元素在其原始位置,则(element-index)将为0,整个乘积将为0,因此为false。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.