Как я могу определить, быстрее ли считать вниз или вверх?

Я пытаюсь сделать функцию isCountDownFaster(from, to, max); кто должен возвращать истину / ложь, но я много борюсь с математикой, кто-то может дать быструю руку?

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

Итак, как я могу определить из этого ^, если это быстрее, чтобы считать вниз или считать от точки "от" до точки "до"? и я на 99% уверен, что есть уравнение, чтобы сделать это без использования цикла и дюжины строк кода.

например, isCountDownFaster должен определить, считается ли этот путь

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

будет быстрее, чем делать это

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

который в этом случае должен вернуться false,

1 ответ

Решение

Эта функция предполагает, что from, to а также max все неотрицательные и что from а также to меньше или равно max, from а также to также могут сравняться друг с другом. Это способствует прямой итерации от from в to итерации путем обтекания массива в случае, если они равны по длине в любом направлении.

Если from равно to, isCountDownFaster всегда будет возвращать ложь, потому что 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)
);

Проверьте консоль разработчика, чтобы увидеть эти результаты.

Другие вопросы по тегам