混乱を列挙する


17

ある正の整数与えられると、オブジェクトのすべての混乱を生成します。nn

詳細

  • 混乱は不動点のない順列です。(この手段は、すべての混乱の数にすることはできません番目のエントリ)。ii
  • 出力は、数字の並べ替え(または)で構成される必要があります。(1,2,,n)(0,1,2,,n1)
  • あるいは、(またはそれぞれ)の混乱を常に印刷することもできますが、そうする必要があります。(n,n1,,1)(n1,n2,,1,0)
  • 出力は決定的である必要があります。つまり、入力として指定されたでプログラムが呼び出されるときは常に、出力は同じである必要があります(これには、混乱の順序が同じままである必要があります)。毎回有限の時間(確率1でこれで十分ではありません)。n
  • と仮定できます。n2
  • 特定のnについては、すべての混乱を生成するか、インデックスとして機能する別の整数kを取得し、k番目の混乱を(選択した順序で)出力できます。

混乱の順序は、ここにリストされている順序と同じである必要はないことに注意してください。

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はいこれは、他の2つの言及された方法に十分似ていると思います(または、それに対して強力な議論があると思いますか?)。
flawr

1
@Fatalize実際には、デフォルト
flawr

回答:



5

Brachylog、9バイト

⟦kpiᶠ≠ᵐhᵐ

オンラインでお試しください!

これは、[0, …, n-1]givenの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

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

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すべての混乱を含むを返します。非常に非効率です生成し、繰り返し時間のサイズの組み合わせとして可能な値をから、順列と混乱をフィルタリングします。(n2n)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),]

オンラインでお試しください!

はるかに効率的で、matrix各行が混乱した場所を返します。



1

C ++(gcc)207 196バイト

ceilingcatで-5バイトRoman Odaiskyで-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 ::配列ですので、特に場合は、出力パラメータを使用する場合は、より良い行うことができ、それの前のサイズ- 145バイト
ローマOdaisky

@RomanOdaisky:良いアイデアですが、コードゴルフのルールをどのように理解するかは、事前割り当てコードをバイトカウントに含める必要があります。
movatica

@movatica灰色の領域、コードは無効ではなく有効である可能性が高いと思います。正しい結果をどこかに喜んで書き込み、出力を読み取るのは呼び出し側の責任です。std::copy同様に、STLアルゴリズムは、出力に適切なスペースを提供することを呼び出し元に委ねることに注意してください。
ローマオダイスキー

@RomanOdaisky:STLの動作は確かに有効な引数です。
movatica



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バイト

編集:フィルHと何度かやり取りした後、わずか37バイトに削りました。

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

オンラインでお試しください!

使用することによりWhatever初めに、私たちはブラケットを避けることができます(2つの文字が保存されます)。次は、使用Zしてmetaoperator -ために、各順列の要素(例えば、2,3,1)と減算0,1,2をとるし。それらのいずれかが0(偽)である場合、すべてのジャンクションは失敗します。


元のソリューションは(オンラインで試してみてください!

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

1
良いスタート、Zをオンにしてフィルタを短くすることができます!= -7バイト:tio.run
Phil H

@PhilH zip演算子を統合する方法がなければならないことは知っていましたが、それを理解することはできませんでした。ニース
user0721090601

PhilHはその戦略を使用して、括弧を削除することでさらに3をノックできます。tio.run
##K0gtyjH7n1upoJamYKvwv7ogtSi3tCSxJDM

最後の1つは機能しません。n = 2を除くすべての場合、1つ以上の要素が拒否されます
user0721090601

もちろん、要件を忘れました...削除されました
Phil H

0

44 28バイト

取り消し線44はまだ通常の44です

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。@EricTheOutgolferの非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になるため、偽になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.