您将获得一组逻辑语句。您的挑战是,以最佳方式(即删除最少数量的语句)删除任何与其他矛盾的语句。
挑战
您将编写一个程序或函数,该程序或函数将语句列表作为输入,删除最少数量的语句,以便找到解决方案,然后输出其余的语句。
逻辑
语句由变量 A-Z和它们之间的运算符组成。
有5个运算符:-(not),v(or),^(and),->(if)和<->(iff)。
真相表:
A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 | 1 | 0 | 0 | 1 | 1
0 | 1 | 1 | 1 | 0 | 1 | 0
1 | 0 | 0 | 1 | 0 | 0 | 0
1 | 1 | 0 | 1 | 1 | 1 | 1
这些运算符可以与括号组合在一起():
A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 | 1 | 1 | 0 | 1
0 | 1 | 0 | 1 | 0 | 0
1 | 0 | 0 | 1 | 0 | 1
1 | 1 | 0 | 1 | 0 | 0
逻辑系统由1个或多个语句组成。
甲溶液到逻辑系统是所有的状态语句是同时真。
逻辑系统示例:
AvB
-(A<->B)
(AvB)->(-B)
唯一的解决方案是A = 1, B = 0。
A^B
-(B<->A)
这个没有解决办法 ; 没有任何组合,A并且B两个陈述均正确。
输入值
您将收到一组语句作为输入。这可以通过STDIN或函数参数获取,格式为数组(以方便的格式)或换行符分隔或空格分隔的字符串。
这些语句将采用以下形式(几乎为ABNF):
statement = variable / operation
operation = not-operation / binary-operation
not-operation = "-" operand
binary-operation = operand binary-operator operand
operand = variable / "(" operation ")"
variable = "A"-"Z"
binary-operator = "v" / "^" / "->" / "<->"
语句示例:
A
Av(-B)
(A<->(Q^C))v((-B)vH)
输出量
您必须以收到的确切格式返回(可能)简化的语句集。同样,列表可以设置为字符串数组或换行符分隔或空格分隔的格式。
规则
- 您应该始终删除最少数量的语句。如果有多个可能的解决方案,请输出其中之一。
- 您可以假定输入始终包含至少1条语句,并且在输入中不重复任何语句。
- 您可能不会假定输出始终包含一条语句。(请参见示例)
- 使用标准漏洞与您的答案有效不符,必须删除其中之一。
- 这是代码高尔夫球,因此最短的答案以字节为单位。
例子
输入:
A^(-A)
输出:
(nothing)
输入:
A^B A<->(-B) A<->B
输出:
A^B A<->B
输入:
["AvB","A^B"]
输出:
["AvB","A^B"]
3
我不知道这是否相关,但是这个问题归结为最大包装数量,这是NP完整的。
—
Leif Willerts 2015年
根据您的语法,示例中的第三条陈述不正确(
—
骄傲的haskeller 2015年
(AvB)->-B应该是(AvB)->(-B))
@proudhaskeller谢谢,改正了这个问题。
—
PurkkaKoodari
另外,括号在
—
2015年
A<->(Q^C))v((-B)vH捣碎。
@proudhaskeller再次感谢。
—
PurkkaKoodari 2015年