Hoạt động nhóm hoán vị


15

Có một sự lựa chọn nổi tiếng giữa hoán vị của n phần tử và các số từ 0 đến n! -1 sao cho thứ tự từ điển của hoán vị và các số tương ứng là như nhau. Ví dụ: với 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)

Người ta cũng biết rằng hoán vị của n phần tử tạo thành một nhóm (nhóm đối xứng của thứ tự n!) - do đó, đặc biệt, một hoán vị của n phần tử áp dụng cho hoán vị thứ hai của n phần tử mang lại hoán vị của n phần tử .

Ví dụ: (1, 0, 2) áp dụng cho (a, b, c) sản lượng (b, a, c), do đó (1, 0, 2) áp dụng cho (2, 1, 0) sản lượng (1, 2 , 0).

Viết chương trình có ba đối số nguyên: n, p1 và p2; giải thích p1 và p2 là hoán vị của n phần tử; áp dụng thứ nhất đến thứ hai; và xuất ra số nguyên tương ứng. Ví dụ:

$ ./perm.sh 3 2 5
3

Câu trả lời:


7

J, 30

Tôi thích sự thanh lịch của điều này:

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

hoặc này:

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

nhưng họ làm việc như thế này:

3 f 2 5
3
12 f 8 9
17

Vì vậy, đây là mục hợp lệ:

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

Một số giải thích:

  • 3 A. 0 1 2: đưa ra hoán vị thứ 3 của 0 1 2(= 1 2 0)
  • 0 1 2 (A.)~ 3: là như nhau nhưng với các đối số đảo ngược
  • 0 1 2 (A.)~/ 3 4 5 ..."áp dụng" (A.)~để 3 4 5 ..., vì vậy nó mang lại cho thứ 3, 4, 5, ... hoán vị của 0 1 2.
  • A. 1 2 0: đưa ra thứ tự hoán vị của 1 2 0(= 3)
  • i. n: đưa ra trình tự 0 1 2 ... n-1
  • 1 2 0 { 0 2 1sắp xếp 0 2 1theo 1 2 0(= 2 1 0)

Làm tốt lắm. Tôi đã xem qua tài liệu cho A.ngày hôm qua, nhưng đã quá mệt mỏi để thử và lắp ráp theo đúng thứ tự cho câu hỏi O :-)
JB

@JB: Tôi đã tự hỏi tại sao không có JB + J ở đây ... :)
Eelvex

4

Ruby - 77 ký tự

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

Thay thế 3 dòng cuối bằng p l.index (l [b] .values_at (* l [a]))
steenslag

Xin lỗi vì nghe có vẻ thô. Tôi có ý định đưa ra lời khuyên, nhưng tôi đã bị lạc trong các vấn đề định dạng, và rõ ràng thời gian chỉnh sửa của tôi đã hết.
steenslag

ARGV.map{|x|x.to_i}-> $*.map &:to_ilưu một vài ký tự khác. Và bạn có thể thay thế dòng thứ hai bằng l=[*[*0...n].permutation].
Ventero

Không có vấn đề, cảm ơn vì lời khuyên.
david4dev

@Ventero: Tôi thích những thứ này. [* [* 0 ... n] .permuting] làm tôi mỉm cười.
steenslag

2

Python 2.6, 144 ký tự

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.