Header

  1. View current page

    딥뿔이 자라나는 노트

Profile_image?t=1225424611&type=big
나를 바꾼 똑똑한 생활 습관, 스프링노트 - 여러분도 지금 시작해보세요!
38

Factor 연습을 계속 - 평균 구하기

Zed에게 낚여(?) FactorLanguage를 탐험하는 루비스트가 나만은 아니었다. (참조: 새로운 언어와 함께한 주말! Hello, Factor!)

브루스 윌리엄스가 자신의 글 5 Minutes with Factor의 마지막에서 정리한 내용에 꽤 공감된다.

 

Factor 프로그래밍은 강력한 제약이 있기 때문에(혹은 익숙치 않아서 나에게 제약으로 느껴지는지), 문제를 의미있는 작은 단위의 word로 잘게 쪼개서 정의하고, 거기에 적절한 이름을 붙이는 연습처럼 느껴진다. Thinking Forth도 함께 읽고 있는데, 어떤 면에서는 어셈블러 코드 수준으로까지 보이는데, 가독성을 아주 많이 고민하면서 개발하는 모습이 인상적이다.

그리고 스택을 다루는 워드들을 잘 숙지해야겠다. 이 부분은 연습이 좀 필요할 것 같다.

 

오늘은 평균 문제를 잠깐 풀어봤다. 코드 가독성이 좋아보이지는 않는다.

 

  1. ! 평균
    : arithmetic_mean ( seq -- x ) [ length ] keep sum swap length /f ;
    [ 46.2 ] [ { 29 8 75 97 24 40 21 82 77 9 } arithmetic_mean ] unit-test

    ! 기하평균
    : geometric_mean ( seq -- x ) [ log ] map arithmetic_mean exp ;
    [ 34  ] [ { 29 8 75 97 24 40 21 82 77 9 } geometric_mean round ] unit-test

    ! 조화평균
    : harmonic_mean ( seq -- x ) [ geometric_mean 2 ^ ] keep arithmetic_mean / ;
    [ 25 ] [ { 29 8 75 97 24 40 21 82 77 9 } harmonic_mean round ] unit-test

    ! RMS
    : rms ( seq -- x ) [ 2 ^ ] map arithmetic_mean sqrt ;
    [ 56 ] [ { 29 8 75 97 24 40 21 82 77 9 } rms round ] unit-test

    ! 가중치 평균
    : weighted_sum  ( seq1 seq2 -- x ) [ * ] 2map sum ;
    : weighted_mean ( seq1 seq2 -- x ) [ sum ] keep swapd weighted_sum swap / ;
    [ 44 ] [ { 29 8 75 97 24 40 21 82 77 9 } { 3 2 1 2 9 5 3 9 6 9 } weighted_mean round ] unit-test

 

읽기 편한 코드를 만들 수 있을 때까지 연습, 연습!

 

History

Last edited on 12/20/2007 13:48 by deepblue

Comments (0)

You must log in to leave a comment. Please sign in.