turner-townsend-backend-ass.../roman/roman.py

62 lines
1.9 KiB
Python
Raw Permalink Normal View History

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()