Операція перестановної групи


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 елементів, застосованих до другої перестановки 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

Рубін - 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].
Вентеро

Без проблем, дякую за пораду.
david4dev

@Ventero: Мені подобаються такі. [* [* 0 ... n] .пермутація] змусила мене посміхнутися.
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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.