【问题标题】:Simplify three way comparison a < b < c || b < c < a || c < a < b;简化三路比较 a < b < c || b < c < a || c < a < b;
【发布时间】:2021-10-04 23:23:34
【问题描述】:

有没有更短的方法来计算这个布尔表达式?

a &lt; b &lt; c || b &lt; c &lt; a || c &lt; a &lt; b

在 JavaScript 中是:

a &lt; b &amp;&amp; b &lt; c || b &lt; c &amp;&amp; c &lt; a || c &lt; a &amp;&amp; a &lt; b

是否有一些有用的数学或布尔代数技巧可以让这变得不那么麻烦?

abc 都是数字。在我的特定用例中,它们保证是不同的。

(其他上下文,在回复this question的过程中出现)

【问题讨论】:

  • 我只需要isAscending(a, b, c) || isAscending(b, c, a) || isAscending(c, a, b) where isAscending = (a, b, c) =&gt; a &lt; b &amp;&amp; b &lt; c
  • 我只喝了两杯咖啡,如果这是愚蠢的,请原谅我,但在什么情况下这不是是真的?也许用这些来测试会更好?
  • @Martin 如果 a = b = c :p
  • @Martin a = 3, b = 2, c = 1 将是错误的。
  • 添加了更多细节。 @Martin:不。这两种情况的可能性相同。

标签: javascript comparison operators boolean-expression boolean-algebra


【解决方案1】:

您有 3 个不同的布尔比较,您希望其中 2 个保留。 (严格来说,2 个或更多,但在你的情况下,你永远不可能拥有全部 3 个)。所以你可以写

a < b && b < c || b < c && c < a || c < a && a < b

作为

(a < b) + (b < c) + (c < a) == 2

【讨论】: