\begingroup
实现一个函数fff它接受 10 个布尔输入并返回一个布尔值。
唯一的要求是fff它满足身份
f(十1,十2,十3,十4,十5,十6,十7,十8,十9,十10) = f(十2,十3,十4,十5,十6,十7,十8,十9,十10,十1)f(十1,十2,十3,十4,十5,十6,十7,十8,十9,十10)=f(十2,十3,十4,十5,十6,十7,十8,十9,十10,十1)
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
最佳答案
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
–
|
我们可以将输入作为字符串
"0110100011"
吗?\endgroup
–
|