การดำเนินการกลุ่มการเปลี่ยนแปลง


15

มี bijection ที่รู้จักกันดีระหว่างการเรียงสับเปลี่ยนขององค์ประกอบ 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, 0, 2) ใช้กับ (a, b, c) ผลตอบแทน (b, a, c) ดังนั้น (1, 0, 2) นำไปใช้กับ (2, 1, 0) ผลผลิต (1, 2 , 0)

เขียนโปรแกรมที่รับอาร์กิวเมนต์จำนวนเต็มสามตัว ได้แก่ n, p1 และ p2; ตีความ p1 และ p2 เป็นพีชคณิตขององค์ประกอบ n; ใช้ครั้งแรกกับวินาที และส่งออกจำนวนเต็มที่สอดคล้องกัน ตัวอย่างเช่น:

$ ./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 2: ให้การเปลี่ยนรูปที่ 3 ของ0 1 2(= 1 2 0)
  • 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 0: ให้คำสั่งของการเปลี่ยนแปลงของ1 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 ที่นี่ ... :)
Eelvex

4

Ruby - 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

ขออภัยที่ทำให้เกิดเสียงหยาบ ฉันตั้งใจจะให้คำแนะนำ แต่ฉันหลงทางในปัญหาการจัดรูปแบบและเวลาในการแก้ไขของฉันหมดลง
steenslag

ARGV.map{|x|x.to_i}-> $*.map &:to_iบันทึกอีกไม่กี่ตัวอักษร l=[*[*0...n].permutation]และคุณสามารถแทนที่บรรทัดที่สองกับ
Ventero

ไม่มีปัญหาขอบคุณสำหรับคำแนะนำ
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.