在一个范围(包括负数)内对数组进行上溢或下溢索引



我正在用Javascript实现一个brainfuck解释器。我用数组表示内存,我希望可以选择将数组索引限制在一个范围内。如果指数在这个范围之外,我希望它超过或低于限制。我在正确描述这个问题时遇到了一点困难。以下是我所想的一个例子:

lbound:   0, ubound: 10, index:  10, result: 0
lbound:   0, ubound: 10, index:  11, result: 1
lbound: -10, ubound: 0,  index: -10, result: 0
lbound: -10, ubound: 0,  index: -11, result: -1
lbound:  -5, ubound: 15, index:  16, result: -4
lbound:   5, ubound: 15, index:  26, result: 6

我可以编一个函数,比如:

if (index < lbound) {
// underflow
return ubound - index - index * Math.round(index / lbound)
}
if (index > ubound) {
// overflow
return lbound + index - index * Math.round(index / ubound)
}
return index

但这太天真了,忽略了除以零的情况。我想我的做法不对。基本上,我正在寻找一个数学公式,它可以映射包括负数在内的范围内的特定数字。但这不是一个简单的调动。必须计算出正确的过冲或下冲次数。因此,必须从索引中减去lbound或ubound的整个部分。最后,必须将差值加上或减去lbound或ubound。

任何帮助都会很棒。:(

基本上,模是您要查找的操作。只是你让它变得有点棘手,因为你也想支持负数,所以有点";"旋转";模运算结果需要加到"0"上;公式";。

下面的这个功能应该可以做到:

function keepIndexInsideRange(index, lbound, ubound) {
var range = Math.abs(ubound - lbound);
var result = index % range;
if (lbound < 0 && index > ubound) {
result = -(range - result);
}
return result;
}
console.log('should return 0', keepIndexInsideRange(10, 0, 10)); // OK
console.log('should return 1', keepIndexInsideRange(11, 0, 10)); // OK
console.log('should return 0', keepIndexInsideRange(-10, -10, 0)); // OK
console.log('should return -1', keepIndexInsideRange(-11, -10, 0)); // OK
console.log('should return -9', keepIndexInsideRange(1, -10, 0)); // OK
console.log('should return -4', keepIndexInsideRange(16, -5, 15)); // OK
console.log('should return 6', keepIndexInsideRange(26, 5, 15)); // OK

你可以在这里玩https://stackblitz.com/edit/typescript-lxw3ai?file=index.ts(只需展开屏幕右侧的控制台(。

最新更新