排列组运算


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

Answers:


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:给出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 10 2 11 2 0(= 2 1 0)排列

做得好。我A.昨天看了一下文档,但又太累了,无法尝试按正确的顺序整理问题O :-)
JB

@JB:我想知道为什么这里没有JB + J ... :)
Eelvex 2011年

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 2011年

对不起,听起来很粗糙。我本打算提供建议,但我迷失了格式问题,显然我的编辑时间用光了。
steenslag

ARGV.map{|x|x.to_i}-> $*.map &:to_i保存另外几个字符。并且您可以用替换第二行l=[*[*0...n].permutation]
Ventero 2011年

没问题,谢谢你的建议。
david4dev

@Ventero:我喜欢这些。[* [* 0 ... n] .permutation]让我微笑。
steenslag 2011年

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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.