\begingroup

实现一个函数fff它接受 10 个布尔输入并返回一个布尔值。

唯一的要求是fff它满足身份

f12345678910) = f23456789101f12345678910=f23456789101

f(x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8,x_9,x_{10})=f(x_2,x_3,x_4,x_5,x_6,x_7,x_8,x_9,x_{10},x_1)

以及由此得出的其他 9 个循环置换恒等式(包括平凡恒等式),并且不满足与输入元组的置换相对应的任何其他恒等式。(请在您的答案中证明这一点。)

挑战的精神在于找到并解决具有所需对称群的函数,而不是通过蛮力搜索所有21024210242^{1024}10 元真值函数。因此,你的程序在每个输入上最多应运行 1 分钟。

\endgroup

1

  • 1
    \begingroup
    我们可以将输入作为字符串"0110100011"吗?
    \endgroup


    – 


最佳答案
2

\begingroup

,21字节

lambda s:"1011"in s*2

检查输入是否包含1011,从左到右循环读取。不使用较短的子字符串(如“11”或“100”)进行测试的原因是反转输入将始终保留这些子字符串是否存在。

为了解释为什么没有其他排列能保留这一点,请考虑输入0000001101及其循环排列,它们给出 True。排列必须保留结构中每个元素的三个 1 1101,这似乎不可能,除非循环输入。

输入是一串由 1 和 0 组成的字符串。将字符串翻倍可连接前后两部分,这样我们便可以采用包括回绕的方式检查子字符串。


,15字节

lambda n:n<1

如果输入可以作为 10 位数,我们可以简单地检查它是否是 11 的倍数。这可以通过循环来保留,因为2**10-1 = 1023是 11 的倍数。并且为了满足恒等式,排列必须再次保留0000001101最多循环的循环。

\endgroup

4

  • \begingroup
    0如果输入的是仅由s 和s组成的十进制数1,可以A吗?
    \endgroup


    – 

  • \begingroup
    @Neil41不起作用,因为它已经是 的一个因子10**5-1,所以它无法区分第 5 位。可能还有另一个有效的模数
    \endgroup


    – 

  • \begingroup
    @Neil 实际上,运气不好,看起来所有模数都不适用于以 10 为底的数。它们要么有与 41 相同的问题,要么它们的倍数在反转下得以保留。
    \endgroup


    – 


  • \begingroup
    太棒了!我使用我编写的一些代码来计算真值表的对称组,检查了这两种方法是否有效。对于 4 和 5 元数,“1101”方法会导致不必要的对称性 – 我想知道是否存在针对这些元数的解决方案。此外,我想知道这个挑战的变体(需要其他对称组)是否会更有趣。
    \endgroup


    – 

\begingroup

0.8.2,11字节

$
$`
1`1011

以二进制字符串作为输入。解释:现在是 @xnor 答案的移植,因为我之前的答案因逆转而失败。(而且它更长。)

\endgroup

1

  • 1
    \begingroup
    我一开始也这么想,但反转输入会保留它。
    \endgroup


    –