Add solutions to exercises from subsection 2.2.4
This commit is contained in:
parent
2ca5e73a27
commit
2a278157ad
9 changed files with 364 additions and 0 deletions
31
ex-2.44.scm
Normal file
31
ex-2.44.scm
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
(define ein2 (beside einstein (flip-vert einstein)))
|
||||||
|
(define ein4 (below ein2 ein2))
|
||||||
|
(define (right-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((right-split-1 (right-split painter (- n 1))))
|
||||||
|
(beside painter
|
||||||
|
(below right-split-1 right-split-1)))))
|
||||||
|
|
||||||
|
(define (corner-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller-r (right-split painter (- n 1)))
|
||||||
|
(smaller-u (up-split painter (- n 1)))
|
||||||
|
(smaller-c (corner-split painter (- n 1))))
|
||||||
|
(below (beside painter
|
||||||
|
(below smaller-r smaller-r))
|
||||||
|
(beside (beside smaller-u smaller-u)
|
||||||
|
smaller-c)))))
|
||||||
|
|
||||||
|
; the actual exercise:
|
||||||
|
(define (up-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller (up-split painter (- n 1))))
|
||||||
|
(below painter
|
||||||
|
(beside smaller smaller)))))
|
26
ex-2.45.scm
Normal file
26
ex-2.45.scm
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
(define (corner-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller-r (right-split painter (- n 1)))
|
||||||
|
(smaller-u (up-split painter (- n 1)))
|
||||||
|
(smaller-c (corner-split painter (- n 1))))
|
||||||
|
(below (beside painter
|
||||||
|
(below smaller-r smaller-r))
|
||||||
|
(beside (beside smaller-u smaller-u)
|
||||||
|
smaller-c)))))
|
||||||
|
|
||||||
|
(define (split main-dir side-dir)
|
||||||
|
(define (split-function painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller (split-function painter (- n 1))))
|
||||||
|
(main-dir painter
|
||||||
|
(side-dir smaller smaller)))))
|
||||||
|
split-function)
|
||||||
|
|
||||||
|
(define up-split (split below beside))
|
||||||
|
(define right-split (split beside below))
|
15
ex-2.46.scm
Normal file
15
ex-2.46.scm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(define (make-vect x y) (cons x y))
|
||||||
|
(define (xcor-vect v) (car v))
|
||||||
|
(define (ycor-vect v) (cdr v))
|
||||||
|
|
||||||
|
(define (add-vect u v)
|
||||||
|
(make-vect (+ (xcor-vect u) (xcor-vect v))
|
||||||
|
(+ (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (sub-vect u v)
|
||||||
|
(make-vect (- (xcor-vect u) (xcor-vect v))
|
||||||
|
(- (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (scale-vect s v)
|
||||||
|
(make-vect (* s (xcor-vect v))
|
||||||
|
(* s (ycor-vect v))))
|
25
ex-2.47.scm
Normal file
25
ex-2.47.scm
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#lang sicp
|
||||||
|
(define (make-frame origin edge1 edge2)
|
||||||
|
(list origin edge1 edge2))
|
||||||
|
; selectors for the first:
|
||||||
|
(define (origin-frame f)
|
||||||
|
(car f))
|
||||||
|
|
||||||
|
(define (edge1-frame f)
|
||||||
|
(cadr f))
|
||||||
|
|
||||||
|
(define (edge2-frame f)
|
||||||
|
(caddr f))
|
||||||
|
|
||||||
|
|
||||||
|
(define (make-frame origin edge1 edge2)
|
||||||
|
(cons origin (cons edge1 edge2)))
|
||||||
|
; selectors for the second:
|
||||||
|
(define (origin-frame f)
|
||||||
|
(car f))
|
||||||
|
|
||||||
|
(define (edge1-frame f)
|
||||||
|
(cadr f))
|
||||||
|
|
||||||
|
(define (edge2-frame f)
|
||||||
|
(cddr f))
|
23
ex-2.48.scm
Normal file
23
ex-2.48.scm
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
;the setup
|
||||||
|
|
||||||
|
(define (make-vect x y) (cons x y))
|
||||||
|
(define (xcor-vect v) (car v))
|
||||||
|
(define (ycor-vect v) (cdr v))
|
||||||
|
|
||||||
|
(define (add-vect u v)
|
||||||
|
(make-vect (+ (xcor-vect u) (xcor-vect v))
|
||||||
|
(+ (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (sub-vect u v)
|
||||||
|
(make-vect (- (xcor-vect u) (xcor-vect v))
|
||||||
|
(- (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (scale-vect s v)
|
||||||
|
(make-vect (* s (xcor-vect v))
|
||||||
|
(* s (ycor-vect v))))
|
||||||
|
|
||||||
|
;the exercise
|
||||||
|
|
||||||
|
(define (make-segment v1 v2) (cons v1 v2))
|
||||||
|
(define (start-segment s) (car s))
|
||||||
|
(define (end-segment s) (cdr s))
|
72
ex-2.49.scm
Normal file
72
ex-2.49.scm
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
(define outline-painter
|
||||||
|
(segments->painter
|
||||||
|
(list (make-segment (make-vect 0 0)
|
||||||
|
(make-vect 0 1))
|
||||||
|
(make-segment (make-vect 0 1)
|
||||||
|
(make-vect 1 1))
|
||||||
|
(make-segment (make-vect 1 1)
|
||||||
|
(make-vect 1 0))
|
||||||
|
(make-segment (make-vect 1 0)
|
||||||
|
(make-vect 0 0)))))
|
||||||
|
(define x-painter
|
||||||
|
(segments->painter
|
||||||
|
(list (make-segment (make-vect 0 0)
|
||||||
|
(make-vect 1 1))
|
||||||
|
(make-segment (make-vect 0 1)
|
||||||
|
(make-vect 1 0)))))
|
||||||
|
(define diamond-painter
|
||||||
|
(segments->painter
|
||||||
|
(list (make-segment (make-vect 0.5 0)
|
||||||
|
(make-vect 1 0.5))
|
||||||
|
(make-segment (make-vect 1 0.5)
|
||||||
|
(make-vect 0.5 1))
|
||||||
|
(make-segment (make-vect 0.5 1)
|
||||||
|
(make-vect 0 0.5))
|
||||||
|
(make-segment (make-vect 0 0.5)
|
||||||
|
(make-vect 0.5 0)))))
|
||||||
|
|
||||||
|
; this will be a roundabout drawing, just to
|
||||||
|
; make the lines nice and connectable between
|
||||||
|
; wave painters, I'm not an artist.
|
||||||
|
(define wave
|
||||||
|
(segments->painter
|
||||||
|
(list (make-segment (make-vect 0 0.55)
|
||||||
|
(make-vect 0.2 0.5))
|
||||||
|
(make-segment (make-vect 0.2 0.5)
|
||||||
|
(make-vect 0.4 0.6))
|
||||||
|
(make-segment (make-vect 0.4 0.6)
|
||||||
|
(make-vect 0.35 0.8))
|
||||||
|
(make-segment (make-vect 0.35 0.8)
|
||||||
|
(make-vect 0.4 1))
|
||||||
|
(make-segment (make-vect 0.6 1)
|
||||||
|
(make-vect 0.65 0.8))
|
||||||
|
(make-segment (make-vect 0.65 0.8)
|
||||||
|
(make-vect 0.6 0.6))
|
||||||
|
(make-segment (make-vect 0.6 0.6)
|
||||||
|
(make-vect 0.8 0.7))
|
||||||
|
(make-segment (make-vect 0.8 0.7)
|
||||||
|
(make-vect 1 0.55))
|
||||||
|
(make-segment (make-vect 1 0.45)
|
||||||
|
(make-vect 0.8 0.6))
|
||||||
|
(make-segment (make-vect 0.8 0.6)
|
||||||
|
(make-vect 0.6 0.5))
|
||||||
|
(make-segment (make-vect 0.6 0.5)
|
||||||
|
(make-vect 0.6 0.3))
|
||||||
|
(make-segment (make-vect 0.6 0.3)
|
||||||
|
(make-vect 0.7 0))
|
||||||
|
(make-segment (make-vect 0.6 0)
|
||||||
|
(make-vect 0.5 0.2))
|
||||||
|
(make-segment (make-vect 0.5 0.2)
|
||||||
|
(make-vect 0.4 0))
|
||||||
|
(make-segment (make-vect 0.3 0)
|
||||||
|
(make-vect 0.4 0.3))
|
||||||
|
(make-segment (make-vect 0.4 0.3)
|
||||||
|
(make-vect 0.4 0.5))
|
||||||
|
(make-segment (make-vect 0.4 0.5)
|
||||||
|
(make-vect 0.2 0.4))
|
||||||
|
(make-segment (make-vect 0.2 0.4)
|
||||||
|
(make-vect 0 0.45)))))
|
36
ex-2.50.scm
Normal file
36
ex-2.50.scm
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
; inappropriate for the way racket implemented these vectors
|
||||||
|
;(define (make-vect x y) (cons x y))
|
||||||
|
;(define (xcor-vect v) (car v))
|
||||||
|
;(define (ycor-vect v) (cdr v))
|
||||||
|
(define (xcor-vect v) (vector-xcor v))
|
||||||
|
(define (ycor-vect v) (vector-ycor v))
|
||||||
|
|
||||||
|
(define (add-vect u v)
|
||||||
|
(make-vect (+ (xcor-vect u) (xcor-vect v))
|
||||||
|
(+ (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (sub-vect u v)
|
||||||
|
(make-vect (- (xcor-vect u) (xcor-vect v))
|
||||||
|
(- (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (scale-vect s v)
|
||||||
|
(make-vect (* s (xcor-vect v))
|
||||||
|
(* s (ycor-vect v))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (transform-painter painter origin corner1 corner2)
|
||||||
|
(lambda (frame)
|
||||||
|
(let ((m (frame-coord-map frame)))
|
||||||
|
(let ((new-origin (m origin)))
|
||||||
|
(painter (make-frame
|
||||||
|
new-origin
|
||||||
|
(sub-vect (m corner1) new-origin)
|
||||||
|
(sub-vect (m corner2) new-origin)))))))
|
||||||
|
|
||||||
|
(define (flip-horiz painter)
|
||||||
|
(transform-painter painter
|
||||||
|
(make-vect 1.0 0.0)
|
||||||
|
(make-vect 0.0 0.0)
|
||||||
|
(make-vect 1.0 1.0)))
|
43
ex-2.51.scm
Normal file
43
ex-2.51.scm
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
(define (xcor-vect v) (vector-xcor v))
|
||||||
|
(define (ycor-vect v) (vector-ycor v))
|
||||||
|
|
||||||
|
(define (add-vect u v)
|
||||||
|
(make-vect (+ (xcor-vect u) (xcor-vect v))
|
||||||
|
(+ (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (sub-vect u v)
|
||||||
|
(make-vect (- (xcor-vect u) (xcor-vect v))
|
||||||
|
(- (ycor-vect u) (ycor-vect v))))
|
||||||
|
(define (scale-vect s v)
|
||||||
|
(make-vect (* s (xcor-vect v))
|
||||||
|
(* s (ycor-vect v))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (transform-painter painter origin corner1 corner2)
|
||||||
|
(lambda (frame)
|
||||||
|
(let ((m (frame-coord-map frame)))
|
||||||
|
(let ((new-origin (m origin)))
|
||||||
|
(painter (make-frame
|
||||||
|
new-origin
|
||||||
|
(sub-vect (m corner1) new-origin)
|
||||||
|
(sub-vect (m corner2) new-origin)))))))
|
||||||
|
|
||||||
|
; remember 1 is BELOW 2
|
||||||
|
(define (below-a painter1 painter2)
|
||||||
|
(lambda (frame)
|
||||||
|
(let ((paint-lo (transform-painter painter1
|
||||||
|
(make-vect 0.0 0.0)
|
||||||
|
(make-vect 1.0 0.0)
|
||||||
|
(make-vect 0.0 0.5)))
|
||||||
|
(paint-hi (transform-painter painter2
|
||||||
|
(make-vect 0.0 0.5)
|
||||||
|
(make-vect 1.0 0.5)
|
||||||
|
(make-vect 0.0 1.0))))
|
||||||
|
(paint-lo frame)
|
||||||
|
(paint-hi frame))))
|
||||||
|
|
||||||
|
(define (below-b painter1 painter2)
|
||||||
|
(rotate270 (beside (rotate90 painter2) (rotate90 painter1))))
|
93
ex-2.52.scm
Normal file
93
ex-2.52.scm
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#lang sicp
|
||||||
|
|
||||||
|
(#%require sicp-pict)
|
||||||
|
|
||||||
|
|
||||||
|
; a) modified wave:
|
||||||
|
(define wave
|
||||||
|
(segments->painter
|
||||||
|
(list (make-segment (make-vect 0 0.55)
|
||||||
|
(make-vect 0.2 0.5))
|
||||||
|
(make-segment (make-vect 0.2 0.5)
|
||||||
|
(make-vect 0.4 0.6))
|
||||||
|
(make-segment (make-vect 0.4 0.6)
|
||||||
|
(make-vect 0.35 0.8))
|
||||||
|
(make-segment (make-vect 0.35 0.8)
|
||||||
|
(make-vect 0.4 1))
|
||||||
|
(make-segment (make-vect 0.6 1)
|
||||||
|
(make-vect 0.65 0.8))
|
||||||
|
(make-segment (make-vect 0.65 0.8)
|
||||||
|
(make-vect 0.6 0.6))
|
||||||
|
(make-segment (make-vect 0.6 0.6)
|
||||||
|
(make-vect 0.8 0.7))
|
||||||
|
(make-segment (make-vect 0.8 0.7)
|
||||||
|
(make-vect 1 0.55))
|
||||||
|
(make-segment (make-vect 1 0.45)
|
||||||
|
(make-vect 0.8 0.6))
|
||||||
|
(make-segment (make-vect 0.8 0.6)
|
||||||
|
(make-vect 0.6 0.5))
|
||||||
|
(make-segment (make-vect 0.6 0.5)
|
||||||
|
(make-vect 0.6 0.3))
|
||||||
|
(make-segment (make-vect 0.6 0.3)
|
||||||
|
(make-vect 0.7 0))
|
||||||
|
(make-segment (make-vect 0.6 0)
|
||||||
|
(make-vect 0.5 0.2))
|
||||||
|
(make-segment (make-vect 0.5 0.2)
|
||||||
|
(make-vect 0.4 0))
|
||||||
|
(make-segment (make-vect 0.3 0)
|
||||||
|
(make-vect 0.4 0.3))
|
||||||
|
(make-segment (make-vect 0.4 0.3)
|
||||||
|
(make-vect 0.4 0.5))
|
||||||
|
(make-segment (make-vect 0.4 0.5)
|
||||||
|
(make-vect 0.2 0.4))
|
||||||
|
(make-segment (make-vect 0.2 0.4)
|
||||||
|
(make-vect 0 0.45))
|
||||||
|
(make-segment (make-vect 0.4 0.85) ; modifications to wave:
|
||||||
|
(make-vect 0.45 0.85)) ;
|
||||||
|
(make-segment (make-vect 0.55 0.85) ;
|
||||||
|
(make-vect 0.6 0.85)) ;
|
||||||
|
(make-segment (make-vect 0.4 0.75) ;
|
||||||
|
(make-vect 0.5 0.7)) ;
|
||||||
|
(make-segment (make-vect 0.5 0.7) ;
|
||||||
|
(make-vect 0.6 0.75)) ;
|
||||||
|
(make-segment (make-vect 0.6 0.75) ;
|
||||||
|
(make-vect 0.4 0.75))))) ;
|
||||||
|
|
||||||
|
(define (right-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((right-split-1 (right-split painter (- n 1))))
|
||||||
|
(beside painter
|
||||||
|
(below right-split-1 right-split-1)))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (up-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller (up-split painter (- n 1))))
|
||||||
|
(below painter
|
||||||
|
(beside smaller smaller)))))
|
||||||
|
|
||||||
|
(define (corner-split painter n)
|
||||||
|
(if (= n 0)
|
||||||
|
painter
|
||||||
|
(let ((smaller-r (right-split painter (- n 1)))
|
||||||
|
(smaller-u (up-split painter (- n 1)))
|
||||||
|
(smaller-c (corner-split painter (- n 1))))
|
||||||
|
(below (beside painter
|
||||||
|
(below (below smaller-r smaller-r) ; changes to
|
||||||
|
(below smaller-r smaller-r))) ; corner split
|
||||||
|
(beside (beside (beside smaller-u smaller-u) ;
|
||||||
|
(beside smaller-u smaller-u)) ;
|
||||||
|
smaller-c)))))
|
||||||
|
|
||||||
|
(define (square-of-four tl tr bl br)
|
||||||
|
(lambda (painter)
|
||||||
|
(let ((top (beside (tl painter) (tr painter)))
|
||||||
|
(bottom (beside (bl painter) (br painter))))
|
||||||
|
(below bottom top))))
|
||||||
|
|
||||||
|
(define (square-limit painter n)
|
||||||
|
(let ((combine4 (square-of-four flip-vert rotate180 ; changes to square-limit
|
||||||
|
identity flip-horiz))) ;
|
||||||
|
(combine4 (corner-split painter n))))
|
Loading…
Add table
Reference in a new issue