Estoy implementando un intérprete de brainfuck en Javascript. Estoy representando la memoria con una matriz y me gustaría tener la opción de limitar los índices de la matriz dentro de un rango. Si el índice está fuera de este rango, quiero que pase por encima o por debajo de los límites. Tengo un pequeño problema para describir el problema correctamente. Aquí hay un ejemplo de lo que estoy pensando:
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: 6Podría hacer una función algo como:
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 indexPero eso es demasiado ingenuo y se pierde el caso de dividir por cero. Supongo que tengo un enfoque equivocado aquí. Básicamente, estoy buscando una fórmula matemática que asigne un número específico dentro de un rango que incluya números negativos. Pero no una simple reasignación. Se debe calcular el número correcto de sobreimpulsos o subimpulsos. Por lo tanto, las partes enteras de lbound o ubound deben restarse del índice. Y finalmente la diferencia se tiene que sumar o restar a lbound o ubound.
Cualquier ayuda sería genial. :)
Básicamente módulo es la operación que estás buscando. Solo que lo está haciendo un poco más complicado, ya que también desea admitir números negativos, por lo que se debe agregar un poco de "rotación" del resultado del módulo a la "fórmula".
Esta función a continuación debería hacer el truco:
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)); // OKPuedes jugar con él aquí https://stackblitz.com/edit/typescript-lxw3ai?file=index.ts (solo expande la consola en el lado derecho de la pantalla).