任务
定义
考虑点{1,2,3,4,5}及其所有排列。我们可以通过一个简单的技巧找到这5个点的可能排列总数:成像用这些点填充5个插槽,第一个插槽将具有5个可能的数字,第二个插槽将具有5个可能的数字(因为已经使用一个填充了第一个插槽)第三三个,依此类推。因此,置换的总数为5 * 4 * 3 * 2 * 1;这将是5!排列或120个排列。我们可以将其视为对称组S5,然后对称组Sn将具有n! or (n*n-1*n-2...*1)
置换。
“偶数”排列是偶数个偶数长度周期的排列。以循环表示法(例如(1 2 3)(4 5)
置换)书写时最容易理解1->2->3->1
,4->5->4
并且具有1个3个长度的周期(1 2 3)
和1个2个长度的周期(4 5)
。当将排列归类为奇数或偶数时,我们忽略奇数长度的循环,并说此排列[ (1 2 3)(4 5)
]为奇数,因为它具有偶数长度循环的奇数{1}。甚至示例:
(1)(2 3)(4 5)
=两个2长度循环| 偶数(1 2 3 4 5)
=没有均匀的长度循环| 偶数 *请注意,如果不存在偶数长度循环,则排列是偶数。
奇怪的例子:
(1 2)(3 4 5)
= 1个2个长度周期| 奇数|(1)(2 3 4 5)
= 1个4个长度的周期| 奇数|
由于在任何对称组中恰好一半的排列是偶数,因此我们可以将偶数组称为交替组N,因此S5 = 120 A5 = 60排列。
符号
至少为此,应使用循环符号来编写排列,其中每个循环使用不同的括号,并且每个循环以升序排列。例如(1 2 3 4 5)
没有(3 4 5 1 2)
。对于具有单个数字的循环,例如:(1)(2 3 4)(5)
可以排除单个/固定点的含义(1)(2 3 4)(5) = (2 3 4)
。但是标识(所有点都固定的点(1)(2)(3)(4)(5)
)应该写成()
只是用来表示它。
挑战
我希望您以尽可能少的代码将任何正整数作为输入{1,2,3,4 ...}并显示交替组An的所有排列,其中n是输入/偶数Sn的排列 例如:
Input = 3
()
(1 2 3)
(1 3 2)
和
Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)
就像在示例中一样,我希望消除一个长度的所有周期,并且对于标识:什么也不输出,
()
{不仅是括号,而且无论您使用什么来显示不同的排列},还是id
可以接受的。
额外阅读
您可以在这里找到更多信息:
祝好运
因为这是代码高尔夫球员,所以谁可以在最短的字节中打印出交替组An的排列就赢了。
(2 3 1 4)
按升序排列?您是说我们应该将最小的元素放在前面吗?
(2 3 1 4)
就2->3->1->4->2
可以将它写入(1 4 2 3)
其最小元素第一
[[1, 2], [3, 4]]
而不是(1 2)(3 4)
?