Skip to content

Instantly share code, notes, and snippets.

@staticshock
Last active August 29, 2015 14:21
Show Gist options
  • Save staticshock/81ee72dfc2bed85613eb to your computer and use it in GitHub Desktop.
Save staticshock/81ee72dfc2bed85613eb to your computer and use it in GitHub Desktop.
Roman numerals in python
#!/usr/bin/env python
# 100 = C = 100
# 200 = CC = 100 + 100
# 300 = CCC = 100 + 100 + 100
# 400 = CD = -100 + 500
# 500 = D = 500
# 600 = DC = 500 + 100
# 700 = DCC = 500 + 100 + 100
# 800 = DCCC = 500 + 100 + 100 + 100
# 900 = CM = -100 + 1000
# 2929 = MM CM XX IX = 2000 + 900 + 20 + 9
ROMAN = {
1: 'I',
5: 'V',
10: 'X',
50: 'L',
100: 'C',
500: 'D',
1000: 'M',
}
# given 586, yields 6, 8, 5
def digits(num, base=10):
while True:
yield num % 10
num = num // 10
if num == 0:
break
# given 586, yields D, L, X, X, X, V, I
def roman_digits(num):
for index, digit in reversed(list(enumerate(digits(num)))):
if digit < 4: # III
for _ in range(digit):
yield ROMAN[10 ** index]
elif digit == 4: # IV
yield ROMAN[10 ** index]
yield ROMAN[5 * 10 ** index]
elif digit < 9: # VIII
yield ROMAN[5 * 10 ** index]
for _ in range(digit - 5):
yield ROMAN[10 ** index]
elif digit == 9: # IX
yield ROMAN[10 ** index]
yield ROMAN[10 * 10 ** index]
def roman_numeral(num):
return "".join(roman_digits(num))
# Test
import random
for num in range(1, 3500):
if random.randint(0, num) < 10:
print("%i = %s" % (num, roman_numeral(num)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment