I googled this and I haven’t found a similar challenge, so I’d like to pose this question to you all!

Let’s say I give you a range from 1 to 2000. Within this range, find the number that yields the most characters. I asked a friend of mine and he worked out that 1888 has a lot of characters (MDCCCLXXXVIII).


import time

    ('M',   1000),
    ('CM',  900),
    ('D',   500),
    ('CD',  400),
    ('C',   100),
    ('XC',  90),
    ('L',   50),
    ('XL',  40),    
    ('X',   10),
    ('IX',  9),
    ('V',   5),
    ('IV',  4),
    ('I',   1)]

def roman_numeral(number):
    roman_number = [];
    for (symbol, value) in SYMBOLS:
        while value <= number:
            number -= value
    return ''.join(roman_number);

start = time.time();

pairs = [(i, roman_numeral(i)) for i in range(1, 2000)]
pairs.sort(lambda a,b: cmp(len(a[1]), len(b[1])))

print 'Longest roman numeral for numbers 1-2000 = %d -> %s' %  \
    (pairs[-1][0], pairs[-1][1])

print 'Took: %.2fsec' % (time.time() - start,)


Longest roman numeral for numbers 1-2000 = 1888 -> MDCCCLXXXVIII
Took: 0.14sec


Turns out historically there wasn’t a strict set of rules for Roman numerals, for example IV and IIII are both valid representations of the number 4. Only recent rules have added limits on the number of repeated characters and what values can be subtracted from other values. [Reference][2].

[2]: Roman numerals