Вот как я это сделаю:
// The % operator in JavaScript is the remainder operator.
// The following function defines the modulo operator.
const mod = (x, y) => (x % y + y) % y;
// Law: mod(start + shortestPath(start, end, length), length) === end
const shortestPath = (start, end, length) => {
const forward = mod(end - start, length);
const backward = mod(start - end, length);
return forward > backward ? -backward : forward;
};
const shortestPathLaw = (start, end, length) =>
mod(start + shortestPath(start, end, length), length) === end;
console.assert(shortestPathLaw(4, 6, 10));
console.assert(shortestPathLaw(8, 6, 10));
console.log(shortestPath(4, 6, 10)); // 2
console.log(shortestPath(8, 6, 10)); // -2
Мы используем оператор по модулю для вычисления прямого расстояния от точки A до точки B (т. Е. B - A
).Расстояние назад от точки A до точки B такое же, как расстояние вперед от точки B до точки A (то есть A - B
).Затем мы выбираем меньшее из двух расстояний, и если расстояние, которое мы выбрали, является обратным расстоянием, то мы отрицаем его, чтобы показать, что мы едем назад от А, чтобы достичь B.