1부터 n까지 합을 구하는 프로그램을 몇 가지로 만들어 봤습니다.
글자를 줄이려고 노력하다보니 나름 눈이 뜨이는 경험을 해서 글을 한 번 남겨봅니다.
sum1 =: +/ @: >: @: i.
처음 생각한 가장 간단한 버전. composition 사용. 공백 빼고 10글자
sum2 =: + (+/ @: i.)
>: 을 안 쓸 수는 없을까 싶어 hook을 이용. 9글자
sum3 =: %&2 @: (* +&1)
공식과 bonding을 이용. 11글자로 늘어남
sum4 =: 2 %~ (* +&1)
시험삼아 commuting을 이용. 다시 9글자
sum5 =: 2 %~ (* >:)
increment를 쓰면 글자를 더 줄일 수 있을 것 같았음. 8글자
sum6 =: >: * -:
반으로 나누는 연산자가 있을 것 같아 사전을 찾아봄. fork를 사용. 5글자
일단 여기까지 해봤습니다. 특히 마지막 버전을 쓰고 보니
1부터 n까지 합이 '하나 더한 것과 반으로 나눈 것을 곱한 것'으로 읽히면서
((n + 1) * n) / 2라는 공식의 의미가 더 직관적으로 받아들여지는 느낌이 들었습니다.
그리고 이런 것이 J가 주는 재미 중 하나가 아닐까 하는 생각도 들었습니다.
이런 경험하신 분들 또 안 계신가요?
저는 inverse(^:_1)을 사용하는 모습을 보면서, 즐거운 경험을 했습니다.16진수를 10진수로 바꾸는 코드입니다.
dfh=. 16&#. @ ('0123456789ABCDEF'&i.) NB. decimal from hexdfh 'FEED'
65261그런데 hfd(hex from decimal)는 너무나 간단하게 hfd =: dfh inv 라고 풀어버립니다. 생각해보면 맞는 말인데, 이렇게 생각하기가 쉽지가 않았습니다. 하지만 J에서는 흔하게 볼 수 있는 문제해결법입니다. 저는 이걸 볼 때 정말 큰 재미를 느꼈습니다. 이게 저의 Aha! moment였습니다.
(hfd =: dfh inv) 65261
--
Google 그룹스 'jaylang' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 jay...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 jaylang+u...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/jaylang?hl=ko에서 그룹을 방문하세요.