背景
所述置换的奇偶性,由维基百科所定义,如下:
排列σ的符号表示为sgn(σ),如果σ为偶数,则定义为+1,如果σ为奇数,则定义为-1。
排列的符号可以明确表示为
sgn(σ)=(-1)^ N(σ)
其中,N(σ)是σ中的求逆数。
替代地,可以从置换成分解为换位的乘积来定义置换的符号
sgn(σ)=(-1)^ m
其中,m是分解中的换位数。
对于那些在数学上不喜欢希腊字母汤的人,我将尝试通过一个示例(也从维基百科窃取)来简化定义。
例
考虑输入数组{1, 2, 3, 4, 5}
,以及它的一个排列,比如说{3, 4, 5, 2, 1}
。为了从原始数组获取其排列,您必须交换索引0
和2
,1
和3
,然后交换2
和4
。尽管这不是唯一的解决方案,但奇偶校验定义明确,因此适用于所有情况。
由于需要进行3次交换,因此我们用odd
奇偶校验标记此排列。如您所料,要求偶数交换的排列具有even
奇偶性。
挑战
您面临的挑战是编写尽可能少的字节的程序以确定排列的奇偶性。您的程序或函数必须:
- 接受两个输入数组(或字符串)作为参数,分别表示排列前后的集合。
- 给定排列,返回或打印
e
偶数或o
奇数字符。 - 应该假设数组或字符串中的所有索引都具有唯一值。
测试用例
假设您声明了一个名为的函数f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
这是代码高尔夫,以字节为单位的最短程序胜出!
[10], [10] -> e
零换位)。[10 30 20], [30 20 10] -> e
(两个换位)。[10 30 20 40], [30 20 40 10] -> o
(三个换位)