121

코딩 도장

일주일에 하나씩 가벼운 마음으로 코드를 작성합니다. 누가 떠밀지 않아도 스스로 자라길 원하는 사람들...
클럽장: 아샬 | 클럽주소: http://club.filltong.net/codingdojo

풀이|


더뮤바 삼각지대 (Scheme)  

2008. 08. 25 23:53|조회수:54
CoMKiD CoMKiD

http://club.filltong.net/codingdojo/5754  복사

문제: http://codingdojo.filltong.net/5505

 

C++로 풀려고 시도하다가 단위테스트를 사용하는데 약간의 애로사항이 꽃 펴서 scheme으로 짜봤습니다. Scheme에 쓸만한 단위 테스트가 있는지는 잘 모르겠고.. 그냥 대충 그 때 그 때 필요한 테스트 프로시저만 만들어서 썼습니다.

 

지난 주 코딩 도장에서 한번 풀었던 거라 그런지 자꾸 그 때 생각이 나서 TDD로 스텝 나누는게 생각대로 잘 되지 않았습니다. 그래서 말이 scheme이지 지난번 python 코드와 별다를게 없네요.. (소수점 4자리에서 반올림은 안했습니다..)

 

요새는 참 코딩하는게 어렵다는 생각이.. (한숨)

 

Source

(define (make-point x y) (cons x y))
(define (x point) (car point))
(define (y point) (cdr point))

(define (make-coord row col) (cons row col))
(define (row coord) (car coord))
(define (col coord) (cdr coord))

(define (point idx)
  (let ((crd (coord idx)))
    (let ((h (sqrt 0.75))
          (r (row crd))
          (c (col crd)))
      (define (x) (* (- c r) 0.5))
      (define (y) (* h (- r (* (/ 1 3) (remainder c 2)))))
    (make-point (x) (y)))))

(define (coord idx)
  (define (idx-in-row? start end)
    (and (<= start idx) (< idx end)))
  (define (cols-num row) (+ (* 2 row) 1))
  (define (iter idx start end row)
    (if (idx-in-row? start end)
        (make-coord row (- idx start))
        (iter idx end (+ end (cols-num (+ row 1))) (+ row 1))))
  (iter idx 0 1 0))

(define (distance p1 p2)
  (let ((dx (- (x p1) (x p2)))
        (dy (- (y p1) (y p2))))
    (sqrt (+ (square dx) (square dy)))))

(define (even? n) (= (remainder n 2) 0))
(define (square x) (* x x))

(define (same-point? p1 p2)
  (and (= (x p1) (x p2))
       (= (y p1) (y p2))))

(define (same-coord? c1 c2)
  (and (= (row c1) (row c2))
       (= (col c1) (col c2))))

(display "coord-test\r")
(same-coord? (coord 0) (make-coord 0 0))
(same-coord? (coord 1) (make-coord 1 0))
(same-coord? (coord 2) (make-coord 1 1))
(same-coord? (coord 3) (make-coord 1 2))
(same-coord? (coord 4) (make-coord 2 0))
(same-coord? (coord 5) (make-coord 2 1))
(same-coord? (coord 9) (make-coord 3 0))

(display "point-test\r")
(same-point? (point 0) (make-point 0 0))
(same-point? (point 1) (make-point -0.5 (sqrt 0.75)))
(same-point? (point 2) (make-point 0 (* (sqrt 0.75) (/ 2 3))))
(same-point? (point 3) (make-point 0.5 (sqrt 0.75)))
(same-point? (point 4) (make-point -1.0 (* 2 (sqrt 0.75))))
(same-point? (point 5) (make-point -0.5 (* (sqrt 0.75) (+ 1 (/ 2 3)))))
(same-point? (point 9) (make-point -1.5 (* 3 (sqrt 0.75))))
(same-point? (point 10) (make-point -1.0 (* (sqrt 0.75) (+ 2 (/ 2 3)))))

(display "distance-test\n")
(= (distance (make-point 0 0) (make-point 1 1)) (sqrt 2))

(display "distance-result\n")
(distance (point 0) (point 7))
(distance (point 2) (point 8))
(distance (point 9) (point 10))
(distance (point 10) (point 11))

 

 

Result

coord-test
#t
#t
#t
#t
#t
#t
#t
point-test
#t
#t
#t
#t
#t
#t
#t
#t
distance-test
#t
distance-result
1.5275252316519465
1.5275252316519465
0.5773502691896258
0.5773502691896258

댓글 0

등록

목록 맨위로


다음글   소스 코드를 웹에 올릴 때 쓸만한 유틸|   카페모카
이전글   더뮤바 삼각지대 (squeak)|   달룟
글쓰기