Simple function which returns a text representation for numbers in range [1...1000].
N100 = 'hundred'
N1000 = 'one thousand'
N1_9 = [
'one', 'two', 'three',
'four', 'five', 'six',
'seven', 'eight', 'nine',
]
N10_19 = [
'ten', 'eleven', 'twelve',
'thirteen', 'fourteen', 'fifteen',
'sixteen', 'seventeen', 'eighteen',
'nineteen',
]
Nx10 = [
'twenty', 'thirty', 'forty',
'fifty', 'sixty', 'seventy',
'eighty', 'ninety',
]
def make_word(num):
assert 0 < num <= 1000
if num == 1000:
return N1000
lst = [0] * 3
for i in xrange(3):
div = 10 ** (2 - i)
lst[i] = num / div
num %= div
res = []
if lst[0] != 0:
res.append(
'{} {}'.format(N1_9[lst[0]-1], N100)
)
if lst[1] or lst[2]:
if lst[1] == 0:
res.append(
N1_9[lst[2] - 1]
)
elif lst[1] == 1:
res.append(
N10_19[lst[2]]
)
else:
if lst[2] == 0:
res.append(
Nx10[lst[1] - 2]
)
else:
res.append(
'{}-{}'.format(Nx10[lst[1] - 2], N1_9[lst[2] - 1])
)
return ' and '.join(res)
for x in xrange(1, 1000 + 1):
print x, make_word(x)
Is it possible to rewrite the function a little bit cleaner? Maybe decrease a number of branches somehow