CODE-0004 · grok-4.3 (default)
def int_to_roman(n):
    if not 1 <= n <= 3999:
        raise ValueError("n must be in 1..3999")
    val_sym = [
        (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"),
        (100, "C"), (90, "XC"), (50, "L"), (40, "XL"),
        (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")
    ]
    res = []
    for val, sym in val_sym:
        while n >= val:
            res.append(sym)
            n -= val
    return "".join(res)

_valid = {int_to_roman(i): i for i in range(1, 4000)}

def roman_to_int(s):
    if not s or s not in _valid:
        raise ValueError("invalid Roman numeral")
    return _valid[s]