"""
Binary to Gray code conversion algorithm.

Reference:
https://en.wikipedia.org/wiki/Gray_code
"""


def binary_to_gray(binary: str) -> str:
    """
    Convert a binary number (as string) to its equivalent Gray code.

    The Gray code is generated by XOR-ing each bit with the bit just before it.

    Args:
        binary (str): A string representing a binary number (e.g., "10101010").

    Returns:
        str: The corresponding Gray code string.

    Example:
        >>> binary_to_gray("10101010")
        '11111111'

        >>> binary_to_gray("1101")
        '1011'
    """
    # Convert binary string to integer
    binary_int = int(binary, 2)

    # XOR the binary number with itself shifted right by 1 bit
    gray_int = binary_int ^ (binary_int >> 1)

    # Convert the integer result back to a binary string (remove '0b' prefix)
    gray_code = bin(gray_int)[2:]

    # Pad with leading zeros to maintain same bit length as input
    return gray_code.zfill(len(binary))


if __name__ == "__main__":
    # Take input from user
    binary_input = input("Enter a binary number: ").strip()

    # Validate the input (only 0s and 1s allowed)
    if not all(bit in "01" for bit in binary_input):
        print("❌ Invalid input! Please enter only 0s and 1s.")
    else:
        result = binary_to_gray(binary_input)
        print(f"✅ The Gray code for binary {binary_input} is: {result}")
