Skip to content

Instantly share code, notes, and snippets.

@nesquena
Created May 27, 2009 13:48
Show Gist options
  • Save nesquena/118649 to your computer and use it in GitHub Desktop.
Save nesquena/118649 to your computer and use it in GitHub Desktop.
''' Project Euler # 17, Nathan Esquenazi '''
words = {
1000 : 'thousand',
100 : 'hundred',
90 : 'ninety',
80 : 'eighty',
70 : 'seventy',
60 : 'sixty',
50 : 'fifty',
40 : 'forty',
30 : 'thirty',
20 : 'twenty',
19 : 'nineteen',
18 : 'eighteen',
17 : 'seventeen',
16 : 'sixteen',
15 : 'fifteen',
14 : 'fourteen',
13 : 'thirteen',
12 : 'twelve',
11 : 'eleven',
10 : 'ten',
9 : 'nine',
8 : 'eight',
7 : 'seven',
6 : 'six',
5 : 'five',
4 : 'four',
3 : 'three',
2 : 'two',
1 : 'one'
}
connects = {
'thousand' : 'and',
'hundred' : 'and'
}
numbers = words.keys()
numbers.sort(reverse=True)
def num2word(remaining_number, numbers, words, connects):
full_word = []
while remaining_number > 0:
for number in numbers:
english = words[number]
connect_word = connects.get(english, '')
if number <= remaining_number:
divide = remaining_number / number
remaining_number = remaining_number % number
if connect_word: full_word.append(' '.join(num2word(divide, numbers, words, connects)))
full_word.append(english)
if connect_word and remaining_number: full_word.append(connect_word)
break
return full_word
print sum(len(word) for num in xrange(1, 1001) for word in num2word(num, numbers, words, connects))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment