对于两个二进制变量A和B,有16个不同的布尔函数:
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
小于运算符<
(通常不被视为NOT,AND或OR之类的逻辑运算符)在应用于布尔值时实际上是以下功能之一(F4):
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
有趣的是,我们可以使用仅包含符号的表达式来模拟其他 15个函数()<AB10
。就像在许多标准编程语言中一样,将读取和评估这些表达式,例如,括号必须匹配,并且<
在表达式的两边都必须有参数。
具体来说,这些表达式必须符合以下语法(以Backus-Naur形式给出):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
这意味着A<B<1
不允许使用无用的parethese和形式的表达式。
因此,表达式A<B
与函数F4匹配,并且A<B<1
必须将其更改为(A<B)<1
或A<(B<1)
。
为了证明所有其他15个函数都可以转换为表达式,就足以形成一组功能上完整的表达式,因为根据定义,它们可以组合为任何函数的表达式。
这样的一组表达式是x<1
(where x
is A
或B
),is是¬x
和and (((B<A)<1)<A)<1
,后者是A → B
。否定(¬
)和蕴含(→
)在功能上是完整的。
挑战
使用这些字符()<AB10
,以上述形式编写与16个不同的布尔函数中的每一个等效的16个表达式。
目的是使每个表达式都尽可能短。您的分数是16个表达式中每个字符的总和。最低分获胜。Tiebreaker会采用最早的答案(前提是他们以后没有使用别人的简短表达来编辑答案)。
从技术上讲,您不需要为该比赛编写任何实际的代码,但是,如果您确实编写了任何程序来帮助您生成表达式,则强烈建议您发布它们。
您可以使用此堆栈代码片段来检查您的表达式是否符合预期: