Euler problem 17を解いた。

問題17
1 から 5 までの数字を英単語で書けば one, two, three, four, five であり、全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている。

では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば、全部で何文字になるか。

注: 空白文字やハイフンを数えないこと。例えば、342 (three hundred and forty-two) は 23 文字、115 (one hundred and fifteen) は20文字と数える。なお、"and" を使用するのは英国の慣習。

#-*- coding:utf-8 -*-
N=1000
B=[i for i in range(1,N+1)]
C=[]

D={0:"",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine",10:"ten",11:"eleven",12:"twelve",13:"thirteen",14:"fourteen",15:"fifteen",16:"sixteen",17:"seventeen",18:"eighteen",19:"nineteen",20:"twenty",30:"thirty",40:"forty",50:"fifty",60:"sixty",70:"seventy",80:"eighty",90:"ninety",100:"hundred",1000:"thousand"}

#1~99までを文字列化
def num1(X):
	if X >= 20: return D[X-X%10]+D[X%10]
	else: return D[X]

#100~999までを文字列化
def num2(X):
	if X % 100 ==0: return	D[X/100]+D[100]
	else: return	D[X/100]+D[100] +"and"+num1(X%100)

#1000~9999までを文字列化
def num3(X):
	if X % 1000==0:	return D[X/1000] +D[1000]
	else:	return D[X/1000]+D[1000]+num2(X%1000)

if __name__=="__main__":
	for i in B:
		if i >= 1000:	C.append(num3(i))
		elif (i >= 100) & (i <=999):	C.append(num2(i))
		else:	C.append(num1(i))

	print	sum([len(i) for i in C])