换向27个功能


22

介绍

让我们将三元函数定义为从三元素集S = {0,1,2}到其自身的函数:它与的S另一个元素的每个元素相关联S。三元函数的一个示例f

f(0) = 0; f(1) = 2; f(2) = 0

共有27种不同的三元函数,我们用0到26之间的整数表示它们:函数f编码为f(0) + 3*f(1) + 9*f(2)。上面的示例函数被编码为数字6。

我们可以应用两种三元功能fg顺序,如果f(g(k)) == g(f(k))适用于所有kS,那么功能上下班。您的任务是验证是否是这种情况。

输入项

您的输入是两个整数,范围从0到26。它们表示两个三元函数,f并且g。输入必须采用十进制,二进制或一元(1s的字符串)格式。

输出量

如果和,您的输出是真实值fg下班,。您可能不认为输入是有序的。

例子

考虑输入5和16。它们对三元函数进行编码

f(0) = 2; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 2; g(2) = 1

我们有f(g(1)) == f(2) == 0g(f(1)) == g(1) == 2,所以fg没有上下班和正确的输出是falsey。

另一方面,输入3和10对三元函数进行编码

f(0) = 0; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 0; g(2) = 1

它可以验证f(g(k)) == g(f(k))所有持有kS。那么正确的输出是真实的。

这是所有可能的输入的27×27表,其中+标出了真实输出和-虚假输出:

+ - - + - - + - - + - - + - - + - - + - - + - - + - -
- + - - - - - - - - - - + - - - - - - - - + - - - - -
- - + - - - - - - - - - - - - - - - - - - + - - + - -
+ - - + - - - - - - + - - + - - - - + - - + - - - - -
- - - - + - - - - - - - - + - - - - - - - + - - - - -
- - - - - + - - - - - - - + - - - - - - - + - - - - -
+ - - - - - + - - - - - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
- - - - - - - - + - - - - - - - - - + - - + - - - - -
+ - - - - - - - - + - - - - - - - - - - - + - - - - -
- - - + - - - - - - + - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
+ + - - - - - - - - - - + + - - - - - - - + + - - - -
- - - + + + - - - - - - + + + - - - - - - + + + - - -
- - - - - - - - - - - - - + + - - - - - - + - - - - -
+ - - - - - - - - - - - - - - + - - - - - + - - - - -
- - - - - - - - - - - - - - - - + - - - - + - + - - -
- - - - - - - - - - - - - - - - - + - - - + + - - - -
+ - - + - - - - + - - - - - - - - - + - - + - - - - +
- - - - - - - - - - - - - - - - - - - + - + - - - - +
- - - - - - - - - - - - - - - - - - - - + + - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - + + - - - + - - - + + - - - +
- - - - - - - - - - - - - + - - + - - - - + - + + - +
+ - + - - - - - - - - - - - - - - - - - - + - + + - +
- - - - - - - - - - - - - - - - - - - - - + - - - + +
- - - - - - - - - - - - - - - - - - + + + + + + + + +

规则和计分

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞


输入可以是两个数字组成的数组吗?
路易斯·门多

1
@DonMuesli根据对Meta的共识允许。
Zgarb

Answers:


4

果冻,17 14 13字节

+13ḃ3Um0ị2/⁼/

在线尝试!验证所有27×27个案例

怎么运行的

+13ḃ3Um0ị2/⁼/  Main link. Argument: [f, g] (encoded as integers)

+13            Add 13 ([1, 1, 1] in base 3) to f and g.
   ḃ3          Convert f + 13 and g + 13 to bijective base 3.
               Bijective base 3 uses the digits 1 to 3 instead of 0 to 2.
               This yields [[f(2)+1, f(1)+1, f(0)+1], [g(2)+1, g(1)+1, g(0)+1]].
               The increments account for 1-based indexing.
     U         Reverse each digit array.
               This yields [[f(0)+1, f(1)+1, f(2)+1], [g(0)+1, g(1)+1, g(2)+1]].
      m0       Concatenate the list with a reversed copy of itself.
        ị2/    Split the result into pairs, and reduce each one by indexing.
               This computes g○f and f○g.
          ⁼/   Reduce by match; return 1 iff g○f = f○g.

我已经复制了您验证所有测试用例并显示矩阵的想法:-)
Luis Mendo

3

MATL19 18字节

I:PII$YAZ{Y:)1Mw)=

Truthy是一个包含所有对象的数组。Falsy是一个包含至少一个零的数组。

在线尝试!验证所有情况(需要几秒钟)。

       % implicitly input an array of two numbers
I:P    % push [3 2 1]
I      % push 3
I$     % specify that the next function takes 3 inputs
YA     % convert input to base 3 with alphabet [3 2 1] and 3 digits. Gives 2x3 array
Z{     % convert into cell of two cells, one with each row
Y:     % split cell array. We have two arrays on the stack, one per function
)      % index operation to compute f ∘ g. Function composition is indexing
1M     % push the two arrays again
w      % swap the two arrays
)      % index operation to compute g ∘ f
=      % test for equality element-wise
       % implicitly display

我认为通常只有空白列表才是虚假的。
Timtech '16

1
@Timtech 取决于语言。在MATL中,包含零的数组是虚假的。
丹尼斯

好的,只是检查一下……
Timtech '16

@Timtech当然!在此更详细地说明:当表达式的结果
Luis

3

Python 2,61字节

lambda m,n:all(n/3**(m/i%3)%3==m/3**(n/i%3)%3for i in[1,3,9])

给定一个输入i,我们可以实现n通过执行n/3**i%3提取的i三进制数来表示的功能n0,1,2当以任意顺序应用函数时,该函数检查对于每个函数都获得相同的结果。实际上,由于第一步正在执行3**,因此将使用进行测试[1,3,9]

代码重用看起来很浪费,但是我没有找到更好的方法。比较:

q=lambda x,i:x/3**i%3;lambda m,n:all(q(m,q(n,i))==q(n,q(m,i))for i in[0,1,2])

1

JavaScript(ES7),68个字节

(a,b)=>![0,1,2].some(n=>t(a,t(b,n))-t(b,t(a,n)),t=(a,n)=>a/3**n%3|0)

不幸的是,以3为基础的转换太昂贵了:

(a,b)=>[0,1,2].every(n=>a[b[n]]==b[a[n]],g=a=>(27+a).toString(3).slice(1),a=g(a),b=g(b))

0

Mathematica,77个字节

Reverse[#][[#2+{1,1,1}]]==Reverse[#2][[#+{1,1,1}]]&@@IntegerDigits[{##},3,3]&

Mathematica的基于索引的索引再次出现!


1
分配{1,1,1}给变量并使用它的时间较短。
CalculatorFeline
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.