对区间使用模块化算法

Using modular arithmetics for interval

假设我们有范围 [-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);  

你知道实现这个的有效方法吗? 另外,有人知道这个问题的正确名称是什么吗?我在网上搜索时遇到问题,因为我不知道如何正确描述这个问题。

先取offset,如果value小于minValuemaxValue,否则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);