我如何确定它是倒计时更快还是向上倒计时更快?

How can i determine if its faster to count down or up?

我正在尝试做一个函数isCountDownFaster(from, to, max);谁应该returntrue/false,但是我在数学上很吃力,有人可以快速帮助吗?

0, 1 ... 32, from, 34 ... 66, to, 68 ... 98, max

那么我如何根据这个 ^ 确定从 "from" 点到 "to" 点倒数或倒数更快?而且我 99% 确定有一个方程式可以做到这一点,而无需使用循环和十几行代码。

例如isCountDownFaster 应该确定是否以这种方式计数

33, 32, 31, ... 2, 1, 0, 99, 98, ... 69, 68, 67

会比这个快

33, 34, 35, ... 65, 66, 67

在这种情况下应该 return false.

这个函数假设fromtomax都是非负的并且fromto小于等于maxfromto 也可以互相相等。它有利于从 fromto 的直接迭代,而不是通过环绕数组进行迭代,以防它们在任一方向上的长度相等。

如果 from 等于 toisCountDownFaster 将始终 return 为假,因为 to >= from 等于 true,使得 ascend 等于 true,并且 direct <= around 也将等于 true,因为 direct 等于 0.

function isCountDownFaster(from, to, max) {
    var ascend = to >= from,
        direct = Math.abs(to - from),
        around = max - direct;

    return !!((direct <= around) ^ ascend);
}

!!((direct <= around) ^ ascend)可以这样解释:

direct <= around | ascend | isCountDownFaster
-----------------|--------|------------------
false            | false  | false
false            | true   | true
true             | false  | true
true             | true   | false

这里有一些测试用例来确认它是否正常工作:

function isCountDownFaster(from, to, max) {
    var ascend = to >= from,
        direct = Math.abs(to - from),
        around = max - direct;

    return !!((direct <= around) ^ ascend);
}

console.log(
    'from: %d\nto: %d\nmax: %d\nisCountDownFaster: %s\n',
    5, 95, 100, isCountDownFaster(5, 95, 100)
);

console.log(
    'from: %d\nto: %d\nmax: %d\nisCountDownFaster: %s\n',
    95, 5, 100, isCountDownFaster(95, 5, 100)
);

console.log(
    'from: %d\nto: %d\nmax: %d\nisCountDownFaster: %s\n',
    45, 55, 100, isCountDownFaster(45, 55, 100)
);

console.log(
    'from: %d\nto: %d\nmax: %d\nisCountDownFaster: %s\n',
    55, 45, 100, isCountDownFaster(55, 45, 100)
);

检查开发人员控制台以查看这些结果。