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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.