我如何确定它是倒计时更快还是向上倒计时更快?
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
.
这个函数假设from
、to
和max
都是非负的并且from
和to
小于等于max
。 from
和 to
也可以互相相等。它有利于从 from
到 to
的直接迭代,而不是通过环绕数组进行迭代,以防它们在任一方向上的长度相等。
如果 from
等于 to
,isCountDownFaster
将始终 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)
);
检查开发人员控制台以查看这些结果。
我正在尝试做一个函数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
.
这个函数假设from
、to
和max
都是非负的并且from
和to
小于等于max
。 from
和 to
也可以互相相等。它有利于从 from
到 to
的直接迭代,而不是通过环绕数组进行迭代,以防它们在任一方向上的长度相等。
如果 from
等于 to
,isCountDownFaster
将始终 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)
);
检查开发人员控制台以查看这些结果。