我正和某人一起玩Javascript游戏,我们玩得很开心,制作荒谬和荒谬的表达方式,让我们的输入获得特定的输出。
这个小迷人的
!a!=!!b^!!-!a||!+!a|!c
似乎总是回归1
。我试图推论出来,但是我在失去所有!
s的跟踪后放弃了。
a
,b
和c
是否有任何不返回1
的值?如果没有,为什么它总是返回1
?
答案 0 :(得分:26)
简短的回答,是的。 a = false, b = false, c = true
是一个反例,因为您的等式与(!!a || !!b || !c)
相同。
答案很长:
!a!=!!b^!!-!a||!+!a|!c
是
(((!a) != (!!b)) ^ (!!(-!a))) || ((!+!a)|!c)
减少到
((Boolean(a) == Boolean(b)) ^ (!a)) || (Boolean(a) | !c)
所以a
,b
和c
的所有内容都只作为真值/假值处理,结果必须是1
或0
|
和^
都会将布尔值强加给数字。
很明显(通过检查||
的权利)如果a
是真实的或c
是假的,那么你会得到1
。
如果a
是假的且c
是真的,那么您有两种可能性,
b
是真实的,在这种情况下,^
条款为1
,因此||
的权利永远不会到达。b
是假的,在这种情况下,^
子句为0
,因此||
的权利支配产生0
。答案 1 :(得分:9)
答案 2 :(得分:4)
你有没有试过在几个循环中运行它:
for(var a = 0; a<100; a++) {
for(var b = 0; b<100; b++) {
for(var c = 0; c<100; c++) {
if((!a!=!!b^!!-!a||!+!a|!c) == 0) {
console.log(a,b, c);
}
}
}
}
a b c
=====
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 0 10
0 0 11
0 0 12
0 0 13
0 0 14
0 0 15
0 0 16
0 0 17
0 0 18
0 0 19
0 0 20
0 0 21
0 0 22
0 0 23
0 0 24
0 0 25
0 0 26
0 0 27
0 0 28
0 0 29
0 0 30
0 0 31
0 0 32
0 0 33
0 0 34
0 0 35
0 0 36
0 0 37
0 0 38
0 0 39
0 0 40
0 0 41
0 0 42
0 0 43
0 0 44
0 0 45
0 0 46
0 0 47
0 0 48
0 0 49
0 0 50
0 0 51
0 0 52
0 0 53
0 0 54
0 0 55
0 0 56
0 0 57
0 0 58
0 0 59
0 0 60
0 0 61
0 0 62
0 0 63
0 0 64
0 0 65
0 0 66
0 0 67
0 0 68
0 0 69
0 0 70
0 0 71
0 0 72
0 0 73
0 0 74
0 0 75
0 0 76
0 0 77
0 0 78
0 0 79
0 0 80
0 0 81
0 0 82
0 0 83
0 0 84
0 0 85
0 0 86
0 0 87
0 0 88
0 0 89
0 0 90
0 0 91
0 0 92
0 0 93
0 0 94
0 0 95
0 0 96
0 0 97
0 0 98
0 0 99
答案 3 :(得分:3)
试试此演示:http://jsfiddle.net/ugfsW/
a = 0,b = 0,c = 1 =&gt;结果:0
如果a=0, b=0(c不具有判别力),结果始终为 0 。
我假设Domain(a)= Domain(b)= Domain(c)
答案 4 :(得分:1)
一些逻辑表达式是tautologies,即它们总是正确的。可能是你找到了一个。尝试verify it。
答案 5 :(得分:0)
您应该使用模型检查器。它将为您提供输出0或1的所有值:-) Spin是一个非常受欢迎的模型检查器。