Back to all solutions

#2543 - Check if Point Is Reachable

Problem Description

There exists an infinitely large grid. You are currently at point (1, 1), and you need to reach the point (targetX, targetY) using a finite number of steps.

In one step, you can move from point (x, y) to any one of the following points:

  • (x, y - x)
  • (x - y, y)
  • (2 * x, y)
  • (x, 2 * y)

Given two integers targetX and targetY representing the X-coordinate and Y-coordinate of your final position, return true if you can reach the point from (1, 1) using some number of steps, and false otherwise.

Solution

/**
 * @param {number} targetX
 * @param {number} targetY
 * @return {boolean}
 */
var isReachable = function(targetX, targetY) {
  let g = gcd(targetX, targetY);
  while (g % 2 === 0) {
    g /= 2;
  }

  return g === 1;
};

function gcd(a, b) {
  while (b) {
    a %= b;
    [a, b] = [b, a];
  }
  return a;
}