Project Euler 254

プロジェクトオイラー
http://projecteuler.net/index.php?section=problems&id=254


問題の意味はすぐにわかるが、今のところ手がかりがない。20までなら素直に書けばよい。


from itertools import imap, count
from math import factorial

def gen_digit(n):
while n:
yield n % 10
n /= 10

def f(n):
return sum(imap(factorial, gen_digit(n)))

def sum_digits(n):
return sum(gen_digit(n))

def sf(n):
return sum_digits(f(n))

N = 20
a = [ 0 ] * (N + 1)
counter = 0
for k in count(1):
n = sf(k)
if n <= N and a[n] == 0:
a[n] = k
counter += 1
if counter == N:
break
print sum(map(sum_digits, a))


あれこれ考えて組んでいるが、90くらいから進まなくなる。もう一工夫が必要のようだ。