【问题标题】:Using modular arithmetics for interval对区间使用模算术
【发布时间】:2020-05-21 13:20:01
【问题描述】:

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

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

【问题讨论】:

  • 通过将间隔规范为始终从 0 开始来简化问题(很多)。

标签: javascript carousel modulo infinite


【解决方案1】:

首先得到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);

【讨论】:

  • 很好的解决方案。它不适用于 MIN_VALUE=2 和 MAX_VALUE=6 等正区间
  • 你想从这个值中得到什么结果?
  • 对于 MIN_VALUE=2 和 MAX_VALUE=6,输出应该是 [5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4 , 5, 6, 2, 3, 4] 从 -10 到 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2018-05-26
  • 1970-01-01
  • 2011-10-22
  • 2023-01-11
  • 2017-01-14
  • 2011-07-25
相关资源
最近更新 更多