Euler_89.py (1027B)
1 import sys 2 3 with open('files/p089_roman.txt') as f: 4 numerals = f.read().splitlines() 5 6 characters = {'I': 1, 'V': 5, 'X': 10, 'L' : 50, 'C' : 100, 'D': 500, 'M': 1000} 7 8 digits = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'] 9 tens = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'] 10 hundreds = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'] 11 12 columns = [digits, tens, hundreds] 13 14 chars_saved = 0 15 16 def numeral_to_int(n): 17 vals = [characters[c] for c in reversed(n)] 18 total = vals[0] 19 20 for x in range (1, len(vals)): 21 if vals[x] >= vals[x - 1]: 22 total += vals[x] 23 else: 24 total -= vals[x] 25 26 return total 27 28 def int_to_numeral(i): 29 numeral = '' 30 j = 0 31 while i: 32 if j < 3: 33 numeral += columns[j][i % 10] 34 else: 35 numeral += 'M' * (i % 10) 36 i //= 10 37 j += 1 38 return numeral 39 40 for n in numerals: 41 chars_saved += len(n) - len(int_to_numeral(numeral_to_int(n))) 42 43 print chars_saved