문제: 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
