Operasi grup permutasi

15

Ada suatu penambangan yang terkenal antara permutasi dari n elemen dan angka 0 sampai n! -1 sehingga urutan leksikografis dari permutasi dan angka yang sesuai adalah sama. Misalnya, dengan 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)

Juga diketahui bahwa permutasi n elemen membentuk suatu kelompok (grup simetris orde!) - jadi, khususnya, satu permutasi elemen n yang diterapkan pada permutasi kedua elemen n menghasilkan permutasi elemen n .

Misalnya, (1, 0, 2) diterapkan pada (a, b, c) hasil (b, a, c), jadi (1, 0, 2) diterapkan pada (2, 1, 0) hasil (1, 2) , 0).

Tulis program yang membutuhkan tiga argumen integer: n, p1, dan p2; menafsirkan p1 dan p2 sebagai permutasi dari n elemen; berlaku yang pertama ke yang kedua; dan menampilkan bilangan bulat yang sesuai. Sebagai contoh:

$ ./perm.sh 3 2 5
3
Peter Taylor
sumber

Jawaban:

7

J, 30

Saya suka keanggunan ini:

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

atau ini:

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

tetapi mereka bekerja seperti ini:

3 f 2 5
3
12 f 8 9
17

Jadi ini adalah entri yang valid:

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

Beberapa penjelasan:

  • 3 A. 0 1 2: memberikan permutasi ke-3 dari 0 1 2(= 1 2 0)
  • 0 1 2 (A.)~ 3: sama tetapi dengan argumen dibalik
  • 0 1 2 (A.)~/ 3 4 5 ..."Berlaku" (A.)~untuk 3 4 5 ..., sehingga memberikan permutasi 3, 4, 5, ... dari 0 1 2.
  • A. 1 2 0: memberikan urutan permutasi 1 2 0(= 3)
  • i. n: memberikan urutan 0 1 2 ... n-1
  • 1 2 0 { 0 2 1diatur 0 2 1oleh 1 2 0(= 2 1 0)
Eelvex
sumber
Kerja bagus. Saya mengintip dokumentasi untuk A.kemarin, tetapi terlalu lelah untuk mencoba dan menyusun dalam urutan yang benar untuk pertanyaan O :-)
JB
@ JK: Saya bertanya-tanya mengapa tidak ada JB + J di sini ... :)
Eelvex
4

Ruby - 77 karakter

n,a,b=$*.map &:to_i
l=[*[*0...n].permutation]
p l.index(l[b].values_at *l[a])
david4dev
sumber
Ganti 3 baris terakhir dengan p.index (l [b] .values_at (* l [a]))
steenslag
Maaf sudah terdengar kasar. Saya bermaksud memberi saran, tetapi saya tersesat dalam memformat masalah, dan tampaknya waktu editing saya habis.
steenslag
ARGV.map{|x|x.to_i}-> $*.map &:to_imenyimpan beberapa karakter lainnya. Dan Anda dapat mengganti baris kedua dengan l=[*[*0...n].permutation].
Ventero
Tidak masalah, terima kasih atas sarannya.
david4dev
@Ventero: Saya suka ini. [* [* 0 ... n] .permutasi] membuat saya tersenyum.
steenslag
2

Python 2.6, 144 karakter

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))
Keith Randall
sumber