Egloos | Log-in


생각의 전환

흔히들 함수형 프로그래밍이라고 하면 lisp라던지 haskell을 먼저 떠올리게 됩니다. 하지만 python이라던지 ruby같은 언어들도 함수형 프로그래밍이 가능합니다. 기존의 구조적 프로그래밍이라던지 객체지향 방식에 익숙해져 있어서 많은 분들이 그렇게 코딩을 하고 있을뿐이지 생각의 약간만 전환하면 기존의 언어로도 얼마든지 아름다운 코드를 만들수 있습니다.
아래는 군 말년에 할일없어서 python으로 풀어본 문제입니다. 어쩌면 저때부터 함수형 프로그래밍에 매료됐을지도 모르겠군요.
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.
예를 들어 d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다.
그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다.
예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.
1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

maximum = 5000

def generator(n):
return sum(map(int, tuple(str(n)))) + n

if __name__ == "__main__":
not_self = [j for j in (generator(i) for i in range(1, maximum + 1))]
print sum(i for i in range(1, maximum + 1) if i not in not_self)

원래 not_self에 저장을 안하고 바로 print sum(i for i in range(1, maximum + 1) if i not in [j for j in (generator(i) for i in range(1, maximum + 1))]) 해도 되지만 루프를 돌때마다 1부터 5000까지 not self number를 구해서 속도가 느립니다. haskell이었다면 lazy evaluation을 사용하기 때문에 별로 상관없을텐데 python이라서 어쩔수 없이 한번 저장을 해야됩니다.

by Jihyun | 2007/01/14 19:03 | 트랙백 | 덧글(1)

트랙백 주소 : http://sylphong.egloos.com/tb/809340
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 진우 at 2007/04/14 00:58
안녕하세요 검색해서 들어왔는데 어떻게 저런 소스가 있죠? 저건 어떻게 쓰는건가요? 어디서 써요?
무슨학교 다니세요?
꼭좀 대답해주세요

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶