Использование модульной арифметики для интервала - PullRequest
1 голос
/ 05 февраля 2020

Допустим, у нас есть диапазон [-2, -1, 0, 1, 2, 3], который можно описать как MIN_VALUE = -2 и MAX_VALUE = 3. Мы хотим реализовать функцию под названием infiniteCarousel (), которая будет принимать любое число и используемый оператор по модулю (или что-то еще) для вычисления соответствующего числа в указанном диапазоне.

function infiniteCarousel(value, minValue, maxValue)
{
    // todo
    // use modulus operator to calculate correct number
    // return calculated number 
}


// range = [-2, -1, 0, 1, 2, 3]
const MIN_VALUE = -2;
const MAX_VALUE = 3;

var array = [];

// let's calculate number from -10 to 10
for (var i = -10; i<10; i++)
{
    array.push( infiniteCarousel(i, MIN_VALUE, MAX_VALUE) );
}

// should print [2, 3, -2, -1, 0, 1, 2, 3, -2, -1, 0, 1, 2, 3, -2, -1, 0, 1, 2, 3, -2]
console.log(array);  

Знаете ли вы какой-нибудь эффективный способ реализовать это? Кроме того, кто-нибудь знает, как правильно назвать эту проблему? У меня проблемы с поиском в Интернете, потому что я не знаю, как правильно описать эту проблему.

1 Ответ

2 голосов
/ 05 февраля 2020

Сначала получите offset, если value меньше, чем minValue, возьмите maxValue, в противном случае minValue.

Затем настройте value со смещением, возьмите остаток с помощью count пунктов и используйте смещение для получения значения в требуемом диапазоне.

function infiniteCarousel(value, minValue, maxValue) {
    var count = maxValue - minValue + 1,
        offset = value <= minValue ? maxValue : minValue;
        
    return (value - offset) % count + offset;
}

var array = [];
for (var i = -10; i < 10; i++) array.push(infiniteCarousel(i, -2, 3));

console.log(...[2, 3, -2, -1, 0, 1, 2, 3, -2, -1, 0, 1, 2, 3, -2, -1, 0, 1, 2, 3]);
console.log(...array);

array = [];
for (var i = -10; i < 10; i++) array.push(infiniteCarousel(i, 2, 6));

console.log(...[5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4]);
console.log(...array);
...