順列グループ操作


15

n個の要素と0からn!-1までの数字の順列の間には、順列と対応する数字の辞書式順序が同じになるように、よく知られた全単射があります。たとえば、n = 3の場合:

0 <-> (0, 1, 2)
1 <-> (0, 2, 1)
2 <-> (1, 0, 2)
3 <-> (1, 2, 0)
4 <-> (2, 0, 1)
5 <-> (2, 1, 0)

n個の要素の順列がグループ(n次の対称グループ!)を形成することもよく知られています-したがって、特に、n個の要素の1つの順列がn個の要素の2番目の順列に適用されると、n個の要素の順列が生成されます。

たとえば、(a、b、c)に(1、0、2)を適用すると(b、a、c)が得られるため、(1、0、2)を(2、1、0)に適用すると(1、2 、0)。

n、p1、およびp2の3つの整数引数を取るプログラムを作成します。p1とp2をn個の要素の順列として解釈します。1番目を2番目に適用します。対応する整数を出力します。例えば:

$ ./perm.sh 3 2 5
3

回答:


7

J、30

私はこれの優雅さが好きです:

[:A.[:{/]A.~/~i.@[

またはこれ:

13 :'A.{/(i.x)(A.)~/y'

しかし、彼らはこのように動作します:

3 f 2 5
3
12 f 8 9
17

したがって、これは有効なエントリです。

([:A.[:{/i.@{.A.~/}.)".}.>ARGV

いくつかの説明:

  • 3 A. 0 1 20 1 2(= 1 2 0)の3番目の順列を与える
  • 0 1 2 (A.)~ 3:は同じですが、引数が逆になっています
  • 0 1 2 (A.)~/ 3 4 5 ...に「適用」さ(A.)~れる3 4 5 ...ため、3番目、4番目、5番目、...の順列を与え0 1 2ます。
  • A. 1 2 01 2 0(= 3)の順列の順序を与える
  • i. n:シーケンスを与える 0 1 2 ... n-1
  • 1 2 0 { 0 2 1並べ0 2 1によって1 2 0(= 2 1 0

よくやった。私はA.昨日のドキュメントを覗きましたが、質問O :
JB

@JB:なぜここにJB + Jがなかったのか疑問に思っていました... :)
エルベックス

4

ルビー-77文字

n,a,b=$*.map &:to_i
l=[*[*0...n].permutation]
p l.index(l[b].values_at *l[a])

最後の3行をp l.index(l [b] .values_at(* l [a]))で
置き換えます

ラフに聞こえてすみません。アドバイスするつもりでしたが、フォーマットの問題で迷子になり、どうやら編集時間がなくなったようです。
steenslag

ARGV.map{|x|x.to_i}-> $*.map &:to_iさらに数文字を保存します。そして、2行目をに置き換えることができますl=[*[*0...n].permutation]
ヴェンテロ

問題ありません、アドバイスをありがとう。
david4dev

@Ventero:私はこれらが好きです。[* [* 0 ... n] .permutation]は私を笑顔にしました。
steenslag

2

Python 2.6、144文字

import sys
from itertools import*
n,p,q=map(int,sys.argv[1:])
R=range(n)
P=list(permutations(R))
print P.index(tuple(P[q][P[p][i]] for i in R))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.