# https://leetcode.com/problems/robot-bounded-in-circle/
#
# On an infinite plane, a robot initially stands at (0, 0) and faces north. The robot can receive one of three instructions:
#
# "G": go straight 1 unit;
# "L": turn 90 degrees to the left;
# "R": turn 90 degrees to the right.
# The robot performs the instructions given in order, and repeats them forever.
#
# Return true if and only if there exists a circle in the plane such that the robot never leaves the circle.
# Example 1:
#
# Input: instructions = "GGLLGG"
# Output: true
# Explanation: The robot moves from (0,0) to (0,2), turns 180 degrees, and then returns to (0,0).
# When repeating these instructions, the robot remains in the circle of radius 2 centered at the origin.
# Example 2:
#
# Input: instructions = "GG"
# Output: false
# Explanation: The robot moves north indefinitely.
# Example 3:
#
# Input: instructions = "GL"
# Output: true
# Explanation: The robot moves from (0, 0) -> (0, 1) -> (-1, 1) -> (-1, 0) -> (0, 0) -> ...

# hint1:
# Calculate the final vector of how the robot travels after executing all instructions once - it consists of a change in position plus a change in direction.
#
#
# hint2:
# The robot stays in the circle iff (looking at the final vector) it changes direction (ie. doesn't stay pointing north), or it moves 0.


class Solution:
    def isRobotBounded(self, instructions: str) -> bool:

        start = (0, 0)
        directions = ['north', 'west', 'south', 'east']
        x, y = start
        numd = 0

        for instruction in instructions:
            if instruction == 'L':
                numd += 1
            elif instruction == 'R':
                numd -= 1
            else:
                d = directions[numd % 4]
                if d == 'north':
                    y += 1
                elif d == 'south':
                    y -= 1
                elif d == 'west':
                    x -= 1
                else:
                    x += 1
        if x == 0 and y == 0:
            return True
        elif numd % 4 != 0:
            return True

