対称グループSnの「偶数」順列を循環表記で出力します


9

タスク

定義

ポイント{1,2,3,4,5}とそれらのすべての順列を考慮してください。これらの5つのポイントの可能な順列の総数は、簡単なトリックで確認できます。5つのスロットをこれらのポイントで埋めるイメージ、最初のスロットは5つの可能な数字、2番目のスロットは4つ(最初のスロットを埋めるために使用されているため) 3番目の3など。したがって、順列の総数は5 * 4 * 3 * 2 * 1です。これは5になります。順列または120順列。これは対称群S5と考えることができ、対称群Snにはn! or (n*n-1*n-2...*1)順列があります。

「偶数」の順列とは、偶数の偶数の長さのサイクルがある順列です。(1 2 3)(4 5)順列1->2->3->1などの巡回記法で記述すると、最もわかりやすく、4->5->43つの長さのサイクル(1 2 3)と2つの長さのサイクルが1つずつあります(4 5)。順列を奇数または偶数として分類する場合、奇数長のサイクルを無視し、この順列[ (1 2 3)(4 5)]は奇数であると言います。例でも:

  1. (1)(2 3)(4 5)= 2つの2長さサイクル| EVEN |
  2. (1 2 3 4 5)=長さのサイクルはありません| EVEN | *長さのサイクルが存在しない場合、順列は偶数であることに注意してください。

奇妙な例:

  1. (1 2)(3 4 5)= 1つの2長さサイクル| ODD |
  2. (1)(2 3 4 5)= 1つの4長さサイクル| ODD |

対称グループの順列のちょうど半分が偶数であるため、偶数グループを交互グループNと呼ぶことができるため、S5 = 120 A5 = 60の順列となります。

表記

順列は、少なくともこれのために、各サイクルが異なる括弧内にあり、各サイクルが昇順で行く循環表記で書かれるべきです。例えば(1 2 3 4 5)ない(3 4 5 1 2)です。また、次のような単一の数値を持つサイクルの場合:(1)(2 3 4)(5)単一/固定小数点は、意味を除外できます(1)(2 3 4)(5) = (2 3 4)。ただし、アイデンティティー{すべてのポイントが修正さ(1)(2)(3)(4)(5)れるポイント}は、()それを表すためだけに記述する必要があります。

チャレンジ

可能な限り少ないコードで、入力として任意の正の整数{1,2,3,4 ...}を取り、交互グループAnのすべての順列を表示してください(nは入力/すべての偶数) Snの順列。例えば:

Input = 3
()
(1 2 3)
(1 3 2)

そして

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

また、例と同様に、1つの長さのすべてのサイクルを省略し、IDについては何も出力しない、(){ブラケットだけでなく、さまざまな順列を示すために使用してidいるもの}または許容できるものを出力します。

追加の読書

あなたはここでより多くの情報を見つけることができます:

幸運を

これはcodegolfなので、Alternating Group Anの置換を最短バイトで印刷できる人が勝ちです。


2
プログラミングパズルとコードゴルフへようこそ!通常、出力を柔軟にすることで、正しい形式での出力に問題がある言語に不当な不利益を与えないようにします。たとえば[[1, 2], [3, 4]]代わりに出力することはでき(1 2)(3 4)ますか?
Adnan

@アドナンはい、明確にすべきでした。異なるサイクルが別々に示されている限り、これをどのように表現したかには問題はありません。
2016

「「偶数」順列とは、偶数の偶数順列が存在する場合のことです。」これは周期的な定義のように見えます。最初にサイクル表記を導入してから、その文を「偶数長の偶数サイクル」に書き換えてみませんか?
マーティンエンダー2016

また、サイクル(2 3 1 4)を昇順にするにはどうすればよいですか?一番小さい要素を前に置くだけですか?
マーティンエンダー

@MartinEnderはい最小の要素はそうと、順に限り、それは混乱しないよう最初に行くべきで(2 3 1 4)はない2->3->1->4->2、それは書くことができ(1 4 2 3)、最初にその最小の要素で
ハリー

回答:


5

Pyth、26バイト

t#Mf%+QlT2mcdf<>dTS<dTd.pS

          m            .pSQ   Map over permutations d of [1, …, Q]:
             f        d         Find all indices T in [1, …, Q] such that
               >dT                the last Q-T elements of d
              <   S<dT            is less than the sorted first T elements of d
           cd                   Chop d at those indices
   f                          Filter on results T such that
      Q                         the input number Q
     + lT                       plus the length of T
    %    2                      modulo 2
                                is truthy (1)
t#M                           In each result, remove 0- and 1-cycles.

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

このソリューションは、1行表記の順列とサイクル表記の順列の間の端正な全単射に基づいています。もちろん、2つの表記が同じ順列を表す明らかな全単射があります。

[8、4、6、3、10、1、5、9、2、7] =(1 8 9 2 4 3 6)(5 10 7)

しかし、それではコードが多すぎます。代わりに、すべての先行バージョンよりも小さいすべての数値の前に1行表記を断片に切り、これらの断片を循環と呼び、それらから新しい順列を構築します。

[8、4、6、3、10、1、5、9、2、7]↦(8)(4 6)(3 10)(1 5 9 2 7)

この全単射を逆転させるには、サイクル形式で任意の順列を取り、各サイクルを回転させて最小数が最初になるようにし、最小数が降順になるようにサイクルを並べ替え、すべての括弧を削除します。


OPでは、ID置換を1サイクルなしで表す必要があります。もしそうならなかった方がいいと思います。
マイル

1
ハリーは私のゼリーの答えを大丈夫に思えた、それはのためにさえ1サイクルを印刷するid。たぶん彼はチャイムできますか?
リン

言い方もよくわかりませんが、あなたの(リンの)解法も同じであることに気づきませんでした。
マイル

私の理解では、空の文字列を使用してIDの置換を表すことができないため、すべての1サイクルを維持するように回答を修正しました(これも便利に6バイトを節約します)。
Neil

1
質問をより明確にするために編集しました。答えの2番目の部分で行ったように、「1サイクル」を省略してください。ちなみによくやった。
2016

6

Mathematica、84 49 31バイト

GroupElements@*AlternatingGroup

2つの機能の構成。を{Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}表す形式で出力し(), (a b), (c d)(e f), ...ます。


3

J、53バ​​イト

[:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]

Jは不規則な配列にゼロパディングを行うため、各置換のサイクルはボックス配列として表されます。

41バイトを使用して、出力が緩和されている場合

[:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]

ここで、各置換には1サイクルと0サイクルが含まれます。

使用法

   f =: [:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]
   f 3
┌┬───────┬───────┐
││┌─────┐│┌─────┐│
│││1 2 3│││1 3 2││
││└─────┘│└─────┘│
└┴───────┴───────┘
   f 4
┌┬───────┬───────┬─────────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┬─────────┐
││┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌───┬───┐│
│││2 3 4│││2 4 3│││1 2│3 4│││1 2 3│││1 2 4│││1 3 2│││1 3 4│││1 3│2 4│││1 4 2│││1 4 3│││2 3│1 4││
││└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└───┴───┘│
└┴───────┴───────┴─────────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┴─────────┘

別の実装では、

   f =: [:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]
   f 3
┌─────┬─┬─┐
│1    │2│3│
├─────┼─┼─┤
│1 2 3│ │ │
├─────┼─┼─┤
│1 3 2│ │ │
└─────┴─┴─┘

これは実際に美しいです...よくやった。
2016

2

ゼリー34 28 バイト

L€’SḂ
ṙLR$Ṃµ€Ṣ
Œ!ŒṖ€;/Ç€ÑÐḟQ

こちらでお試しください

説明

Jellyプログラムの各行は関数を定義します。一番下は「main」です。

  • 1行目は、サイクル積が奇数かどうかをテストする関数を定義しています。

    L€      Length of each
      ’     Add 1 to each length 
       S    Take the sum
        Ḃ   Modulo 2
    
  • 2行目は、[1…n]次のように置換のサイクル積へのパーティションを正規化します。

         µ€    For each list X in the partition:
    ṙLR$          Rotate X by each element in [1…length(X)].
        Ṃ         Get the lexicographically smallest element.
                  Thus, find the rotation so that the smallest element is in front.
           Ṣ   Sort the cycles in the partition.
    

    これは、たとえば(4 3)(2 5 1)に変わり(1 2 5)(3 4)ます。

こちらがメインプログラムです。それはnコマンドラインから引数を取り、そして:

Œ!              Compute all permutations of [1…n].
  ŒṖ€           Compute all partitions of each permutation.
     ;/         Put them in one big list.
       ǀ       Normalize each of them into a cycle product.
         ÑÐḟ    Reject elements satisfying the top function,
                i.e. keep only even cycle products.
            Q   Remove duplicates.

5を入力として実行してみましたが、出力がまったくありませんでした。このスクリプトはグループA3とA4だけのものですか、それとも潜在的に任意のグループを与えることができますか?私はこれまでジェリーを見たことがないので、どんな説明も役に立ちます。
ハリー

いいえ、私はチャレンジに3と4だけを入れたので、これまでのところあなたは勝っていますが、本当にもっと学びたいだけです。
2016

Jellyにはパーティションのビルトインがあり、忘れていました!ありがたいことに、友人から思い出されました。そのため、より効率的になり(n = 5を処理し、イェイ!)短くなりました。
リン、

OPは質問を編集して、1サイクルを省略しなければならないことを明確にしました。
Anders Kaseorg 16

2

JavaScript(Firefox 30-57)、220 218 212 211バイト

f=(a,p)=>a[2]?[for(i of a)for(j of f(a.filter(m=>m!=i),p,p^=1))[i,...j]]:[[a[p],a[p^1]]]

残念なことに、88バイトはの順列のリストとして交互グループを生成するだけで十分なaので、出力を目的の形式に変換するために追加の132 130 124 123バイトが必要です。

n=>f([...Array(n).keys()],0).map(a=>a.map((e,i)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&s)

ES6のバージョンを222 216 215バイトに削減できました。

n=>(g=(a,p,t=[])=>a[2]?a.map(e=>g(a.filter(m=>m!=e),p,[...t,e],p^=1)):[...t,a[p],a[p^1]].map((e,i,a)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&r.push(s))([...Array(n).keys(r=[])],0)&&r

形式が完全な循環表記でなくてもかまいません。各置換とそのサイクルが別々に表示されます([1 2 3] [4 5]と<< 123> <45 >>のように両方とも許容されます) )および1つの長さのサイクルが省略されます。多分これはあなたの答えを短くすることができます
ハリー

@ハリー私は絶対に見せません(1,2,3)(4,5)-それは奇妙な順列です!現在、たとえば(1,2,3)(4)(5)、長さ1のサイクルを削除すると6バイトのコストがかかるだけでなく、アイデンティティサイクルの結果が空になり、修正にさらに4バイトのコストがかかります。
Neil

あなたがアイデンティティのために何も印刷されないことを意味するならば、私が言ったように私はそれを受け入れas for the identity outputs of nothing ... are accepatbleます。また、「生データ」を出力した場合、何が表示されますか?(1,2,3)(4)(5)の形式ですか、それとも他の形式ですか?
ハリー

@Harryでは、IDの空白のエントリを含め、長さ1のサイクルを除外し、バイトを節約することに成功しました!
Neil

@Harry Rawデータは[1, 2, 0, 3, 4]その特定の例のためのものなので、希望するものにはほど遠いものです。
Neil

1

GAP、32バイト

カウントを半分に減らしてくれた@ChristianSieversに感謝します。

f:=n->List(AlternatingGroup(n));

プロンプトでの使用:

gap> f(4);
[ (), (1,3,2), (1,2,3), (1,4,3), (2,4,3), (1,3)(2,4), (1,2,4), (1,4)(2,3), (2,3,4), (1,3,4), (1,2)(3,4), (1,4,2) ]

非常に優れた書式設定です。この問題に答えるには、GAPが非常に良い選択だったと思います。
2016

あなたの答えは、ある順列がどこで終わり、次の順列が始まるかを示していません。関数が副作用として値を出力する必要はないが、インタプリタによって出力されるリストとして値を返すだけであると仮定すると、私はそうしますf:=n->List(AlternatingGroup(n));
Christian Sievers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.