排列( 根据维基百科的定义 )的奇偶性如下:
置换σ的符号或签名表示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"这是密码-高尔夫,以字节为单位的最短程序获胜!
发布于 2016-03-20 08:00:51
k%l|m<-zip k l=cycle"eo"!!sum[1|(a,b)<-m,(c,d)<-m,a<c,b>d]用法:
*Main> [8,3,5]%[5,3,8]
'o'方法与我的Python回答相同。骄傲的哈斯勒用cycle保存了一个字节。
从小麦向导中选择58个字节(按照现代删除f=的约定,56个字节):
g m=cycle"eo"!!sum[0|(a,b)<-m,(c,d)<-m,a<c,b>d]
f=(g.).zip发布于 2016-03-20 07:48:39
lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]用法:
>>> f=lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]
>>> f([8,3,5],[5,3,8])
'o'计算两个压缩列表的反转对数,即从每个列表中的(a,A)和(b,B)值与a<b和A>B在同一索引处的值。这些比较组合为a<b<M>A>B,使用列表M大于任何数字的属性。然后取模2,并将其转化为e或o。
发布于 2016-03-20 02:58:46
If[Mod[Plus@@Length/@(Join[{0},#]&)/@PermutationCycles[#][[1]],2]==0,"e","o"]&我同意!
https://codegolf.stackexchange.com/questions/75841
复制相似问题