#!/usr/bin/env python
# David Leonard, mcmxcviii
# as a challenge from steve grundon

# roman numerals
group = {   1: ('i','v'),
	   10: ('x','l'),
	  100: ('c','d'),
	 1000: ('m','A'),
	10000: ('B','C'),
	}

# functions that convert arabic digits to roman numerals
value = {
	    0: lambda i,v,x: "",
	    1: lambda i,v,x: i,
	    2: lambda i,v,x: i+i,
	    3: lambda i,v,x: i+i+i,
	    4: lambda i,v,x: i+v,
	    5: lambda i,v,x: v,
	    6: lambda i,v,x: v+i,
	    7: lambda i,v,x: v+i+i,
	    8: lambda i,v,x: v+i+i+i,
	    9: lambda i,v,x: i+x,
	}

def toroman( n ):
	''' convert a decimal number in [1,4000) to a roman numeral '''
	if n < 1:
	    raise ValueError, "too small: %d"%n
	if n >= 4000:
	    raise ValueError, "too big: %d"%n
	base = 1
	s = ""
	while n > 0:
	    i,v = group[base]
	    base = base * 10
	    x,l = group[base]
	    digit = n % 10
	    n = (n-digit)/10
	    s = value[digit](i,v,x) + s
	return s
	
def fromroman( s, base=1 ):
	''' convert a roman numeral (in lowercase) to a decimal integer '''
	if len(s) == 0:
	    return 0
	if base > 1000: 
	    raise SyntaxError, s
	i,v = group[base]
	x,l = group[base*10]
	if   s[-4:] == v+i+i+i: digit,s = 8,s[:-4]
	elif s[-4:] == i+i+i+i: digit,s = 4,s[:-4]
	elif s[-3:] == v+i+i  : digit,s = 7,s[:-3]
	elif s[-3:] == i+i+i  : digit,s = 3,s[:-3]
	elif s[-2:] == v+i    : digit,s = 6,s[:-2]
	elif s[-2:] == i+x    : digit,s = 9,s[:-2]
	elif s[-2:] == i+v    : digit,s = 4,s[:-2]
	elif s[-2:] == i+i    : digit,s = 2,s[:-2]
	elif s[-1:] == i      : digit,s = 1,s[:-1]
	elif s[-1:] == v      : digit,s = 5,s[:-1]
	else                  : digit,s = 0,s
	return digit*base + fromroman(s,base*10)

def main():
    ''' continuously prompy for roman numeral or arabic integers '''
    import string, sys
    while 1:
	query = string.strip(raw_input("> "))
	if len(query) == 0: continue
	if query == "quit": break
	try:
	    if "0" <= query[0] <= "9":
		print toroman(string.atoi(query))
	    else:
		print fromroman(string.lower(query))
	except:
	    print sys.exc_type, sys.exc_value

if __name__ == '__main__':
    main()

