2025-08-30 12:29:05 +01:00
|
|
|
import readline
|
|
|
|
|
|
2025-08-31 11:34:20 +01:00
|
|
|
|
|
|
|
|
class RomanNumeralConverter:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.valid_numerals = "IVXCM"
|
|
|
|
|
self.values = {"I": 1, "V": 5, "X": 10, "C": 100, "M": 1000}
|
|
|
|
|
|
|
|
|
|
def convert_to_number(self, numerals: str) -> str:
|
|
|
|
|
filtered = self._filter_valid_numerals(numerals)
|
|
|
|
|
if not filtered:
|
|
|
|
|
return "ERROR: Invalid input"
|
|
|
|
|
|
|
|
|
|
values = self._convert_numerals_to_values(filtered)
|
|
|
|
|
return self._format_output(filtered, values)
|
|
|
|
|
|
|
|
|
|
def _filter_valid_numerals(self, numerals: str) -> str:
|
|
|
|
|
"""Extract only valid Roman numerals from input."""
|
|
|
|
|
filtered_chars = [
|
|
|
|
|
char for char in numerals.upper() if char in self.valid_numerals
|
|
|
|
|
]
|
|
|
|
|
return "".join(filtered_chars)
|
|
|
|
|
|
|
|
|
|
def _convert_numerals_to_values(self, numerals: str) -> list[int]:
|
|
|
|
|
"""Convert Roman numeral characters to their integer values."""
|
|
|
|
|
values = []
|
|
|
|
|
for char in numerals:
|
|
|
|
|
match char:
|
|
|
|
|
case "I":
|
|
|
|
|
values.append(1)
|
|
|
|
|
case "V":
|
|
|
|
|
values.append(5)
|
|
|
|
|
case "X":
|
|
|
|
|
values.append(10)
|
|
|
|
|
case "C":
|
|
|
|
|
values.append(100)
|
|
|
|
|
case "M":
|
|
|
|
|
values.append(1000)
|
|
|
|
|
return values
|
|
|
|
|
|
|
|
|
|
def _format_output(self, numerals: str, values: list[int]) -> str:
|
|
|
|
|
"""Format the conversion result for display."""
|
|
|
|
|
if len(values) == 1:
|
|
|
|
|
return f"{numerals} = {values[0]}"
|
|
|
|
|
else:
|
|
|
|
|
values_str = " + ".join(str(v) for v in values)
|
|
|
|
|
return f"{numerals} = {values_str} = {sum(values)}"
|
|
|
|
|
|
|
|
|
|
|
2025-08-30 12:29:05 +01:00
|
|
|
def main():
|
2025-08-31 11:34:20 +01:00
|
|
|
converter = RomanNumeralConverter()
|
2025-08-30 12:29:05 +01:00
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
numerals = input("Please enter some Roman numerals: ")
|
2025-08-31 11:34:20 +01:00
|
|
|
print(converter.convert_to_number(numerals))
|
2025-08-30 12:29:05 +01:00
|
|
|
except (EOFError, KeyboardInterrupt):
|
|
|
|
|
break
|
|
|
|
|
|
2025-08-31 11:34:20 +01:00
|
|
|
|
2025-08-30 12:29:05 +01:00
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|