project-euler

https://projecteuler.net/
Log | Files | Refs | README

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