共轭排列


17

大小为n的排列是对前n个正整数的重新排序。(意味着每个整数出现一次且恰好出现一次)。排列可以像更改大小为n的项列表的顺序的函数一样对待。例如

(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]

因此,排列可以像函数一样构成。

(4 1 2 3)(2 1 3 4) = (4 2 1 3)

这带来了许多有趣的属性。今天,我们专注于共轭。如果存在置换gg -1(也为n),则置换yx(均为n)是共轭的。

x = gyg-1

GG -1等于身份置换(第一Ñ以正确的顺序编号)。

您的任务是通过标准输入法获取大小相同的两个排列,然后确定它们是否为共轭形式。您应该输出两个一致值之一,如果它们是共轭,则输出一个,如果不是,则另一个。

这是因此答案将以字节计分,而字节越少越好。

关于共轭置换,有许多定理可供您使用,祝您好运和高尔夫愉快。

您可以将输入作为表示上述排列的值的有序容器(1-n或0-n),也可以作为接受有序容器并执行排列的函数。如果选择采用函数,则应将其作为参数,而不要使用预定义的名称。

测试用例

(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False 
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True

我们可以将输入作为函数吗?我们也可以采用n大小吗?
xnor

@xnor可以肯定的是。我不确定第一个会如何帮助您。
发布Rock Garf Hunter,

默认的函数输入规则允许假定函数是预定义的,如果允许的话,可以节省写入参数时的字节数。
xnor

@xnor我们在谈论这个规则吗? 那是针对黑匣子功能的,而排列不是。这是有道理的,因为共识旨在允许没有函数指针/对象的语言进行竞争,而在这里之所以可以这样做是因为可以用其他方式表示置换。
发布Rock Garf Hunter,

我当时没想到他们是黑匣子。所以在这里,输入可能是一个函数,但仅作为一个显式参数?
xnor

Answers:


6

Python 2,87个字节

f=lambda P,k:k<1or len({sum([x==eval('L['*k+'x'+']'*k)for x in L])for L in P})&f(P,k-1)

在线尝试!

将输入与P两个排列k及其长度作为一对。1共轭和的输出0不是。

这将使用结果:

如果两个置换xyk次x ky k对于从0n的k个具有相等数量的固定点,则它们是完全共轭的。

两个共轭置换满足此要求,因为它们的第k次幂也是共轭的,并且共轭保留了固定点的数量。

不太明显的是,任何两个非共轭置换总是不同的。尤其是,共轭由循环长度的排序列表确定,这些长度可以从固定点的计数中恢复。一种显示方式是线性代数,尽管它可能会过大。

Xx的置换矩阵。那么,x k的不动点数为Tr(X k。这些迹线是具有多重性的X k特征值的幂和对称多项式。这些从0n的k多项式,让我们恢复了这些特征值的相应基本对称多项式,从而恢复了特征多项式,因此也恢复了特征值本身。

由于这些特征值是对应于x周期的单位根,因此我们可以从中恢复周期大小及其乘数。因此,我们的“签名”可以识别直到共轭的排列。


6

J25字节 23字节 16字节

英里的默认解决方案:

-:&([:/:~#&>)&C.

OP的明确解决方案:

c=:4 :'-://:~"1#&>C.&>x;y'   

使用内置C.函数生成周期表示,这将检查置换x和y是否具有相同的周期类型。

   4 1 3 2   c   4 2 1 3
1
   3 2 1 4   c   4 3 2 1
0
   2 1 3 4 5 7 6   c   1 3 2 5 4 6 7
1

1
欢迎来到PPCG,也可以发表第一篇文章。我-:&([:/:~#&>)&C.通过使用默认格式将方法缩短为16个字节。这是一个TIO链接,可以尝试一下。
英里

谢谢。:)我还是一个J初学者,尽管我似乎很容易将其与显式形式很好地结合使用,但是构成有效的默认形式对我来说仍然需要大量的思考。我将添加您的解决方案。
Mathias Dolidon '18

PS:我们也不算函数分配的字符数吗?c=:
Mathias Dolidon

1
@MathiasDolidon不,默认情况下,我们不计算分配所需的字符数,因为该函数可以按原样使用(带括号,但不计算它们)。
暴民埃里克(Erik the Outgolfer)'18年

1
好 !考虑到这一点,我已经追溯更新了标题中显式解决方案的计数。
Mathias Dolidon

4

MATL20 19 17 16字节

xY@!"&G@)@b)X=va

输入:两个列向量(;用作分隔符)。输出:1如果是共轭的,0如果不是。

在线尝试!验证所有测试用例

说明

没有关于置换的定理(出于绝对的无知);只是蛮力和这两个事实:

  • 对于两个置换pq,组成pq等效于使用p索引q的元素。

  • 条件x = gyg -1等效于xg = gy

注释代码:

x      % Implicitly input first permutation, x. Delete it. Gets copied into clipboard G
Y@     % Implicitly input second permutation, y. Push a matrix with all permutations
       % of its elements, each permutation on a different row. So each matrix row is
       % a permutation of [1 2 ...n], where n is the size of y
!      % Transpose. Now each permutation is a column
"      % For each column
  &G   %   Push x, then y
  @    %   Push current column. This is a candidate g permutation
  )    %   Reference indexing. This gives g composed with y
  @    %   Push current column again
  b    %   Bubble up. Moves x to the top of the stack
  )    %   Reference indexing. This gives x composed with g
  X=   %   Are they equal as vectors? Gives true or false
  v    %   Concatenate stack so far. The stack contains the latest true/false result
       %   and possibly the accumulated result from previous iterations
  a    %   Any: gives true if any element is true. This is the "accumulating" function
       % Implicit end. Implicit display


2

果冻,11字节

Œ!©Ụ€ịị"®⁸e

在线尝试!

怎么运行的

Œ!©Ụ€ịị"®⁸e  Main link. Left argument: x. Right argument: y

Œ!©          Take all permutations g of x. Copy the result to the register.
   Ụ€        Grade up each; sort the indices of each permutation g by their
             corresponding values. For permutations of [1, ..., n], grading up
             essentially computes the inverse, g⁻¹.
     ị       Let each g⁻¹ index into y, computing g⁻¹y.
      ị"®    Let the results index into the corresponding g, computing g⁻¹yg.
         ⁸e  Test if x occurs in the result.

据我了解,实际上是y每个索引的索引g⁻¹,而不是相反。参见示例(4 1 2 3)(2 1 3 4) = (4 2 1 3)。使用您的方法,将导致结果(1 4 2 3),因为第二个索引到第一个索引。考虑到这一点,我有一个12字节的解决方案,我不会破坏。:-)
Erik the Outgolfer

@EriktheOutgolfer固定。
丹尼斯

@Dennis但是我并没有基于解释得出这个结论,我得到了完全相同的方法,除了我有类似的东西Œ!©Ụ€⁹ịЀ®ị"⁸e(基本上所有带有反向参数的索引),只是在进行了重大修改之后变短了。我认为g⁻¹yg这与gyg⁻¹。另外,我认为您的答案也可以从这些修改中受益,但是,正如我之前所说,我还不想破坏乐趣。
暴民埃里克(Erik the Outgolfer)'18年

是的,完全一样。如果是x = g⁻¹yg,则gxg⁻¹ = y,所以xy是共轭的。
丹尼斯

嗯,我觉得我应该再透露一下我的12字节解决方案:eŒ!ị"Ụị@¥€¥¥
Egg the Outgolfer

1

外壳,9个字节

¤¦ṠmöLU¡!

返回1共轭和0非共轭。 在线尝试!

说明

的共轭类的置换的PL = [1,2,...,N]由包含在每个数字的最小周期的多重集确定大号P。当P以列表格式获取时,我可以将L替换为P并获得相同的多集。该程序为每个输入计算相应的多重集,并检查一个是否为另一个的子多重集。由于它们具有相同数量的元素,因此等效于相同的多集。

¤¦ṠmöLU¡!  Implicit inputs: two lists of integers.
¤          Apply one function to both and combine with another function.
  ṠmöLU¡!  First function. Argument: a list P.
  Ṡm       Map this function over P:
       ¡!  iterate indexing into P,
      U    take longest prefix with unique elements,
    öL     take its length.
 ¦         Combining function: is the first list a subset of the other, counting multiplicities?

1

Perl,61 58 57字节

包括+2用于ap

在STDIN上将基于0的排列作为2行

perl -ap '$_=[@1]~~[@1=map{-grep$_-$G[$i++%@G],@F=@G[@F]}@G=@F,0]'
3 0 2 1
3 1 0 2
^D

算法是xnor解决方案中的一个小变化

这个旧版本的代码遇到了一个perl错误,并在我的最新perl上转储了多个输入的内核5.26.1,但它在较旧的perl上有效5.16.3

@{$.}=map{-grep$_==$F[$i++%@F],@G=@F[@G]}@G=@F,0}{$_=@1~~@2

这可能是我的老Perlgolf敌人的又一个实例,这是Perl不能正确引用其堆栈的事实。


1

JavaScript(ES6),66 64字节

(a,b,g=a=>b+a.map(h=(e,i)=>e-i&&1+h(a[e],i)).sort())=>g(a)==g(b)

如果我已正确阅读其他答案,则问题等同于计算所有元素的周期并检查两个列表的每个周期具有相同的编号。编辑:通过计算比时间段少一个,感谢@Arnauld保存了1个字节。@Arnauld通过滥用JavaScript的奇怪强制规则来比较数组,从而节省了另一个字节。可以通过curry节省另一个字节,但是我不喜欢咖喱,除非它是鸡肉tikka masala。

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.