共役順列


17

サイズnの順列は、最初のn個の正の整数の並べ替えです。(各整数が一度だけ表示されることを意味します)。順列は、サイズnのアイテムのリストの順序を変更する関数のように扱うことができます。例えば

(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]

したがって、順列は関数のように構成できます。

(4 1 2 3)(2 1 3 4) = (4 2 1 3)

これは多くの興味深い特性をもたらします。今日私たちは共役に焦点を合わせています。置換yx(両方ともサイズn)は、置換gg -1(サイズnも)がある場合に限り共役です

x = gyg-1

そしてGGは-1恒等置換(最初に等しいn個の適切な順序で番号)。

あなたのタスクは、標準入力メソッドを介して同じサイズの2つの順列を取得し、それらが共役かどうかを判断することです。2つの一貫した値の1つを出力する必要があります。1つは共役で、もう1つは共役ではありません。

これはため、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。

共役順列については多くの定理があり、自由に使用できます。幸運と幸せなゴルフです。

入力は、上記のような順列を表す値の順序付けされたコンテナ(1-nまたは0-n)として、または順序付けされたコンテナを使用して順列を実行する関数として受け取ることができます。関数を使用することを選択した場合、事前定義された名前ではなく、引数として使用する必要があります。

テストケース

(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False 
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True

関数として入力を取得できますか?サイズnを取り込むこともできますか?
xnor

@xnor両方の点で確かです。しかし、最初の方法がどのように役立つかはわかりません。
小麦ウィザード

デフォルトの関数入力ルールでは、関数が事前定義されていると見なすことができます。これにより、許可する場合、引数として書き込む際のバイト数を節約できます。
xnor

@xnor このルールについて話していますか? これは、順列ではないブラックボックス関数用です。これは、コンセンサスが、関数ポインタ/オブジェクトのない言語が競合できるように設計されているのに対し、ここでは置換が別の方法で表現できるためにできるため、理にかなっています。
小麦ウィザード

私は、それらがブラックボックスであることの区別を考えていませんでした。だから、ここでは、入力は関数かもしれませんが、明示的な引数としてのみですか?
xnor

回答:


6

Python 2、87バイト

f=lambda P,k:k<1or len({sum([x==eval('L['*k+'x'+']'*k)for x in L])for L in P})&f(P,k-1)

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

P順列とkその長さのペアとして入力を受け取ります。1共役で0はなく、共役の出力。

これは結果を使用します:

二置換のx及びyは共役正確である場合、それらのk番目のパワーX K及びY Kすべての固定点の等しい数を有するKから0までN

2つの共役順列は、k番目のべきも共役であり、共役は固定小数点の数を保持するため、これを満たします。

2つの非共役順列が常に異なることはそれほど明白ではありません。特に、共役はサイクル長のソートされたリストによって決定され、これらは固定小数点のカウントから回復できます。これを示す1つの方法は、線形代数を使用することですが、それはやり過ぎかもしれません。

ましょXがための順列行列で、X。そして、x kの不動点の数はTr(X kです。これらのトレースは、多重度をもつX kの固有値のべき和対称多項式です。ため、これらの多項式のkから0までのn私たちが対応する回復させ基本対称多項式これらの固有値のを、したがって、特性多項式と固有値自身そう。

これらの固有値はxのサイクルに対応する単位の根であるため、これらから固有のサイクルサイズとその多重度を復元できます。したがって、「署名」は、共役までの順列を識別します。


6

J25バイト 23バイト 16バイト

マイルの暗黙の解決策:

-:&([:/:~#&>)&C.

OPの明示的な解決策:

c=:4 :'-://:~"1#&>C.&>x;y'   

これは、組み込みC.関数を使用してサイクル表現を生成し、順列xとyが同じサイクルタイプを持っているかどうかをチェックします。

   4 1 3 2   c   4 2 1 3
1
   3 2 1 4   c   4 3 2 1
0
   2 1 3 4 5 7 6   c   1 3 2 5 4 6 7
1

1
PPCGへの最初の投稿へようこそ。-:&([:/:~#&>)&C.暗黙の形式を使用して、メソッドを16バイトに短縮しました。ここだTIOのリンクはそれを試してみます。
マイル

ありがとうございました。:)私はまだJ初心者であり、明示的な形式で簡単に使用できるように見えますが、効率的な暗黙の形式を作成するには、まだ多くのことを考える必要があります。ソリューションを追加します。
マティアスドリドン

PS:関数の割り当ての文字もカウントしませんか?c=:
マティアスドリドン

1
@MathiasDolidonいいえ、デフォルトのコンセンサスでは、関数がそのまま使用される可能性があるため、割り当てに必要な文字はカウントしません(括弧を使用しますが、カウントしません)。
エリックアウトゴルファー

1
OK !これを考慮するために、タイトルの明示的なソリューションのカウントを遡及的に更新しました。
マティアスドリドン

4

MATL20 19 17 16バイト

xY@!"&G@)@b)X=va

入力:2つの列ベクトル(;区切り文字として使用)。出力:1共役の場合、0そうでない場合。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

使用された順列に関する定理はありません(全くの無知から)。ブルートフォースと次の2つの事実:

  • 2つの順列pおよびqの場合、合成pqは、pを使用してqの要素にインデックスを付けることと同等です。

  • 条件X = GYGは-1と同等であるXG = GY

コメントされたコード:

x      % Implicitly input first permutation, x. Delete it. Gets copied into clipboard G
Y@     % Implicitly input second permutation, y. Push a matrix with all permutations
       % of its elements, each permutation on a different row. So each matrix row is
       % a permutation of [1 2 ...n], where n is the size of y
!      % Transpose. Now each permutation is a column
"      % For each column
  &G   %   Push x, then y
  @    %   Push current column. This is a candidate g permutation
  )    %   Reference indexing. This gives g composed with y
  @    %   Push current column again
  b    %   Bubble up. Moves x to the top of the stack
  )    %   Reference indexing. This gives x composed with g
  X=   %   Are they equal as vectors? Gives true or false
  v    %   Concatenate stack so far. The stack contains the latest true/false result
       %   and possibly the accumulated result from previous iterations
  a    %   Any: gives true if any element is true. This is the "accumulating" function
       % Implicit end. Implicit display


2

ゼリー、11バイト

Œ!©Ụ€ịị"®⁸e

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

使い方

Œ!©Ụ€ịị"®⁸e  Main link. Left argument: x. Right argument: y

Œ!©          Take all permutations g of x. Copy the result to the register.
   Ụ€        Grade up each; sort the indices of each permutation g by their
             corresponding values. For permutations of [1, ..., n], grading up
             essentially computes the inverse, g⁻¹.
     ị       Let each g⁻¹ index into y, computing g⁻¹y.
      ị"®    Let the results index into the corresponding g, computing g⁻¹yg.
         ⁸e  Test if x occurs in the result.

私が理解する限り、実際yにはそれぞれg⁻¹にインデックスを付けるのであり、逆ではありません。例を参照してください(4 1 2 3)(2 1 3 4) = (4 2 1 3)。あなたのアプローチでは(1 4 2 3)、2番目のインデックスが最初のインデックスになるため、代わりになります。それを考慮して、私はまだ損なわない12バイトのソリューションを持っています。:-)
エリック・ザ・アウトゴルファー

@EriktheOutgolfer修正済み。
デニス

@Dennisしかし、私は説明に基づいてその結論に達しませんでしたが、私はまったく同じアプローチに到達しましたが、Œ!©Ụ€⁹ịЀ®ị"⁸e大きな修正を行った後は短くなることを除いて(基本的にすべての引数が逆のインデックス付け)のようなものがありました。とg⁻¹yg同じだとは思わないgyg⁻¹。また、あなたの答えもそれらの変更から利益を得ることができると思いますが、前に言ったように、私はまだ楽しみを台無しにしたくありません。
エリックアウトゴルファー

はい、まったく同じです。もしx = g⁻¹yg、それからgxg⁻¹ = y、そうxyコンジュゲートしています。
デニス

私はその後、私の12バイトのソリューションを明らかにしなければならないようフム、私は感じる:eŒ!ị"Ụị@¥€¥¥
エリックOutgolfer

1

、9バイト

¤¦ṠmöLU¡!

1共役および0非共役に対して返します。 オンラインでお試しください!

説明

順列の共役類PL = [1,2、...、N]は、各数の最小期間を含む多重集合によって決定されるLPを。ときPがリスト形式で撮影され、私は置き換えることができますLをPと同じ多重集合を取得します。プログラムは、各入力に対応するマルチセットを計算し、一方が他方のサブマルチセットであるかどうかをチェックします。要素の数が同じであるため、これは同じマルチセットであることに相当します。

¤¦ṠmöLU¡!  Implicit inputs: two lists of integers.
¤          Apply one function to both and combine with another function.
  ṠmöLU¡!  First function. Argument: a list P.
  Ṡm       Map this function over P:
       ¡!  iterate indexing into P,
      U    take longest prefix with unique elements,
    öL     take its length.
 ¦         Combining function: is the first list a subset of the other, counting multiplicities?

1

Perl、61 58 57バイト

含み+2のためにap

STDINの2行として0ベースの順列を与える

perl -ap '$_=[@1]~~[@1=map{-grep$_-$G[$i++%@G],@F=@G[@F]}@G=@F,0]'
3 0 2 1
3 1 0 2
^D

アルゴリズムは、xnorのソリューションのアルゴリズムの小さなバリエーションです

この古いバージョンのコードは、perlのバグにぶつかり、私の最新のperlのいくつかの入力に対してコアをダンプ5.26.1しますが、古いperlでは動作し5.16.3ます。

@{$.}=map{-grep$_==$F[$i++%@F],@G=@F[@G]}@G=@F,0}{$_=@1~~@2

それはおそらく、私の古いperlgolf敵のもう1つの例です。perlはスタックを適切にカウントしないという事実です。


1

JavaScript(ES6)、66 64バイト

(a,b,g=a=>b+a.map(h=(e,i)=>e-i&&1+h(a[e],i)).sort())=>g(a)==g(b)

他の回答を正しく読んだ場合、問題はすべての要素の期間をカウントし、2つのリストの各期間の数が同じであることを確認することと同じです。編集:@Arnauldのおかげで、期間よりも1つ少ない計算をして1バイトを節約しました。JavaScriptの奇妙な強制ルールを悪用して配列を比較することで、@ Arnauldのおかげでもう1バイト節約できました。カレーでもう1バイト節約できますが、チキンティッカマサラでない限り、私はカレーが好きではありません。

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