LeetCode in Kotlin

780. Reaching Points

Hard

Given four integers sx, sy, tx, and ty, return true if it is possible to convert the point (sx, sy) to the point (tx, ty) through some operations__, or false otherwise.

The allowed operation on some point (x, y) is to convert it to either (x, x + y) or (x + y, y).

Example 1:

Input: sx = 1, sy = 1, tx = 3, ty = 5

Output: true

Explanation: One series of moves that transforms the starting point to the target is:

(1, 1) -> (1, 2)

(1, 2) -> (3, 2)

(3, 2) -> (3, 5)

Example 2:

Input: sx = 1, sy = 1, tx = 2, ty = 2

Output: false

Example 3:

Input: sx = 1, sy = 1, tx = 1, ty = 1

Output: true

Constraints:

Solution

@Suppress("NAME_SHADOWING")
class Solution {
    fun reachingPoints(sx: Int, sy: Int, tx: Int, ty: Int): Boolean {
        var tx = tx
        var ty = ty
        while (tx >= sx && ty >= sy) {
            if (tx > ty) {
                tx %= if (ty == sy) {
                    // ty==sy
                    return (tx - sx) % sy == 0
                } else {
                    // ty > sy
                    ty
                }
            } else if (sx == tx) {
                // ty >= tx
                return (ty - sy) % sx == 0
            } else {
                // (tx > sx)
                ty %= tx
            }
        }
        return false
    }
}