代码之家  ›  专栏  ›  技术社区  ›  random-angular-questions

重写不带括号的布尔表达式

  •  0
  • random-angular-questions  · 技术社区  · 7 年前

    我有一个黑盒处理系统,它接受布尔表达式,但不支持括号。我想输入如下布尔表达式:

    A && (B || C)
    

    但是,当我将其输入为:

    A && B || C
    

    它对表达式进行计算,就像我输入了:

    (A && B) || C
    

    有没有办法重写我的表达式以获得所需的A&行为&(B | | C)没有括号?谢谢

    2 回复  |  直到 7 年前
        1
  •  0
  •   IvanGrasp    7 年前

    优先级之间有关系,但可以使用关联定律和分配定律来解决这一问题。

    A && B || A && C
    

    真值表匹配。

    执行此操作时要小心。并非所有编译器和语言都使用相同的优先级和求值顺序。

        2
  •  0
  •   Community CDub    4 年前

    编辑:对不起,没有左右优先权。

    使用 distributive law 以及 && 检查两个 A B 是真的或两者都是 A. C 是真的。

    解决方案

    A && B || A && C

    分配律

    x ^ (y v z) = (x ^ y) v (x ^ z)

    x && (y || z) = (x && y) || (x && z)

    function original(A, B, C) {
      return A && (B || C);
    }
    
    function mySolution(A, B, C) {
      return A && B || C && A;
    }
    
    console.log(original(true, true, true) == mySolution(true, true, true));
    console.log(original(true, true, false) == mySolution(true, true, false));
    console.log(original(true, false, true) == mySolution(true, false, true));
    console.log(original(true, false, false) == mySolution(true, false, false));
    console.log(original(false, true, true) == mySolution(false, true, true));
    console.log(original(false, true, false) == mySolution(false, true, false));
    console.log(original(false, false, true) == mySolution(false, false, true));
    console.log(original(false, false, false) == mySolution(false, false, false));