给定两个不连续循环形式的排列,以不连续循环形式输出其乘积/组成。
要查找组成,请将不相交的循环转换为两行符号的排列。循环的不连续部分中的每个数字都映射到同一部分中跟在其后的数字。它环绕。所以1 -> 5
,5 -> 1
,2 -> 4
,4 -> 2
。如果找不到数字3 -> 3
,则会将其映射到自身。第一个不相交的周期也可以写成(1 5)(2 4)(3)
。这些映射将转换为两行,如下所示(请注意,P和Q的顺序相反):
通过重新排列第二个(最左)排列的列,使其第一行与第一个(最右)排列的第二行相同,可以得到两个排列的乘积。然后可以将乘积写为修改后的第二排列的第二行上的第一排列的第一行。
规则:
- 输入将以列表形式或类似格式给出
- 您可能不会采取类似
(1 5)(2 4)
as之类的[5, 4, 3, 2, 1]
已经两行的形式(将索引映射为值) - 并非每个组中都必须有所有数字,所以您可能会有
(1 5)·(1 2)
,导致(2 5 1)
。 - 您的输出应该可以用作输入。
- 您不需要使用空循环来支持输入
(1 5)·()
。取而代之的是(1 5)·(1)
或等价的。 - 由于循环回绕,因此顺序不重要,只要结果正确即可。
- 您可以从零或一开始。没关系,因为结果相同。
- 数字可以大于
9
。 - 您可能在输出中多次包含相同的数字。所以
[[1],[1]]
是不允许的。 - 注意,该操作不是可交换的!我将Q放在P之前,因为这是Wikipedia所做的。您可以选择任何顺序,但要指定不同的顺序。
- 最短的代码胜出
- 允许内置,但是如果您使用内置的,请在不使用的情况下显示解决方案。
例子:
并未显示所有等效的输出可能性
Input
Output
[[1, 5], [2, 4]], [[1, 2, 4, 3]]
[[1, 4, 3, 5]] (or [[4, 3, 5, 1]] or ...)
[[1, 5]], [[1, 2]]
[[2, 5, 1]]
[[10, 2, 3]], [[2]]
[[3, 10, 2]]
[[1]], [[3]]
[[]] (or [[1]] or something equivalent)
[[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]], [[5,6,7,9,14],[2,8,3,10],[1,11]]
[[12, 14, 6, 1], [8, 15, 10, 3, 2], [13, 11, 7, 9, 4]]
(arguments in reverse order from above gives a different answer)
[[5,6,7,9,14],[2,8,3,10],[1,11]], [[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]]
[[9, 14, 4, 13, 1], [10, 8, 3, 15, 2], [7, 11, 12, 5]]