!a!=!!b^!!-!a||!+!a|!c 可以返回 1 以外的任何值吗?

Posted

技术标签:

【中文标题】!a!=!!b^!!-!a||!+!a|!c 可以返回 1 以外的任何值吗?【英文标题】:Can !a!=!!b^!!-!a||!+!a|!c return anything other than 1? 【发布时间】:2011-10-26 02:14:04 【问题描述】:

我正在和某人玩 javascript 游戏,我们玩得很开心,制作荒谬荒谬的表达式以使我们的输入得到特定的输出。

这个小可爱

!a!=!!b^!!-!a||!+!a|!c

似乎总是返回1。我试图推理出来,但在忘记了所有!s 后我放弃了。

abc 是否有任何不返回 1 的值?如果不是,为什么总是返回1

【问题讨论】:

@Kevin:如果你不在乎,请不要评论。 所以你找到了tautology? 我觉得我应该为此绘制一张卡诺图...... 【参考方案1】:

简短的回答,是的。 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)

所以所有abc 仅作为真/假值处理,结果必须是10,因为|^ 都是强制布尔值到数字。

很明显(通过检查|| 的右侧)如果a 为真或c 为假,您将得到1

如果a 是假的,c 是真的,你有两种可能,

    b 是真实的,在这种情况下,^ 子句是 1,因此永远不会到达 || 的右侧。 b 是假的,在这种情况下,^ 子句是0,所以|| 的右侧占主导地位,产生0

【讨论】:

+1 不错的细分。我以为我已经检查了所有的布尔组合,但我想我没有仔细检查。 最佳答案!...以及一些额外的愚蠢词,以使此评论符合最小长度要求... "__ 可以返回 1 以外的任何值吗?" => “简短的回答,不。” => 它如何返回 1 以外的值的示例,所以简短的回答应该是“是”... @Peter 生成truth table;那么你不会错过任何组合【参考方案2】:

这个怎么样:

var a = undefined, b=undefined, c=!a
alert(!a!=!!b^!!-!a||!+!a|!c)
// Output: 0

Live demo.

【讨论】:

我这样做是为了让您的答案不仅仅是指向可能随时变得不可用的资源的链接。 玩得很好,但是对于 a、b、c 的定义值呢 这是否是“作弊”取决于OP。 @Mimisbrunnr 看起来它适用于 ab 的任何虚假值以及 c 的真实值。 @Mimisbrunnr a=0,b=0,c=1 - 输出 0 :)【参考方案3】:

您是否尝试过在几个循环中运行它:

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

【讨论】:

我有一个三重嵌套循环【参考方案4】:

试试这个演示:http://jsfiddle.net/ugfsW/

a=0, b=0, c=1 => 结果:0

当您有 a=0, b=0 时,结果始终为 0(c 不是判别式)。 我假设 Domain(a) = Domain(b) = Domain(c)

【讨论】:

【参考方案5】:

一些逻辑表达式是tautologies,也就是说,它们总是正确的。你可能找到了一个。试试verify it。

【讨论】:

【参考方案6】:

您应该为此使用模型检查器。它会为您提供所有输出 0 或 1 的值 :-) Spin 是一个非常流行的模型检查器。

【讨论】:

以上是关于!a!=!!b^!!-!a||!+!a|!c 可以返回 1 以外的任何值吗?的主要内容,如果未能解决你的问题,请参考以下文章

!a!=!!b^!!-!a||!+!a|!c 可以返回 1 以外的任何值吗?

如果A与B关联了,也与C关联了,B和C没有关联,B登A的号可以看到C号的消息吗?

异或的性质及应用

[luogu]P1852

java中变量a是double型的。怎么判断a是不是为null

C语言带参数的宏定义后面的字符串可以使复合语句或者干脆一个函数算法么?如下题该怎么写?