diff options
| -rw-r--r-- | coding-exercises/2/50.rkt | 33 | ||||
| -rw-r--r-- | coding-exercises/2/51.rkt | 29 | ||||
| -rw-r--r-- | coding-exercises/2/52.rkt | 65 | ||||
| -rw-r--r-- | coding-exercises/2/53.rkt | 9 | ||||
| -rw-r--r-- | coding-exercises/2/54.rkt | 4 | ||||
| -rw-r--r-- | shared/pict.rkt | 91 |
6 files changed, 228 insertions, 3 deletions
diff --git a/coding-exercises/2/50.rkt b/coding-exercises/2/50.rkt new file mode 100644 index 0000000..373e22a --- /dev/null +++ b/coding-exercises/2/50.rkt @@ -0,0 +1,33 @@ +#lang racket +(require "../../shared/pict.rkt") +(require "../../shared/lists.rkt") +(require sicp-pict) + +(define (flip-horiz painter) + (transform-painter + painter + (make-vect 1 0) + (make-vect 0 0) + (make-vect 1 1))) + +(define (flip-vert painter) + (transform-painter + painter + (make-vect 0 1) + (make-vect 1 1) + (make-vect 0 0))) + +(define (<-rotate180 painter) + (flip-horiz (flip-vert painter))) +(define (<-rotate270 painter) + (transform-painter + painter + (make-vect 0 1) + (make-vect 0 0) + (make-vect 1 1))) + +(paint einstein) +(paint (flip-horiz einstein)) +(paint (flip-vert einstein)) +(paint (<-rotate180 einstein)) +(paint (<-rotate270 einstein)) diff --git a/coding-exercises/2/51.rkt b/coding-exercises/2/51.rkt new file mode 100644 index 0000000..5dcdd70 --- /dev/null +++ b/coding-exercises/2/51.rkt @@ -0,0 +1,29 @@ +#lang racket +(require "../../shared/pict.rkt") + +(define (below painter1 painter2) + (let ((split-point (make-vect 0 0.5))) + (let ((top-painter + (transform-painter + painter2 + split-point + (make-vect 1 0.5) + (make-vect 0 1))) + (bot-painter + (transform-painter + painter1 + (make-vect 0 0) + (make-vect 1 0) + split-point))) + (lambda (frame) + (top-painter frame) + (bot-painter frame))))) + +(define (below2 painter1 painter2) + (<-rotate180 + (<-rotate270 + (beside (<-rotate270 painter1) + (<-rotate270 painter2))))) + +(paint (below einstein einstein)) +(paint (below2 einstein einstein)) diff --git a/coding-exercises/2/52.rkt b/coding-exercises/2/52.rkt new file mode 100644 index 0000000..29f4e6d --- /dev/null +++ b/coding-exercises/2/52.rkt @@ -0,0 +1,65 @@ +#lang racket +(require "../../shared/pict.rkt") + +(define (wave frame) + (let ((wave-points + (list + (make-vect 0.24 0) + (make-vect 0.37 0.5) + (make-vect 0.3 0.6) + (make-vect 0.15 0.5) + (make-vect 0 0.7) + (make-vect 0 0.85) + (make-vect 0.15 0.65) + (make-vect 0.35 0.7) + (make-vect 0.4 0.7) + (make-vect 0.3 0.85) + (make-vect 0.36 1) + (make-vect 0.57 1) + (make-vect 0.62 0.855) + (make-vect 0.55 0.7) + (make-vect 0.65 0.7) + (make-vect 1 0.35) + (make-vect 1 0.25) + (make-vect 0.55 0.52) + (make-vect 0.7 0) + (make-vect 0.55 0) + (make-vect 0.45 0.4) + (make-vect 0.34 0))) + (smile + (list + (make-vect 0.4 0.8) + (make-vect 0.45 0.75) + (make-vect 0.5 0.75) + (make-vect 0.53 0.78)))) + ((segments->painter + (append + (line-points->segments smile) + (line-points->segments + (close-line + wave-points)))) frame))) +(paint wave) + +(define (corner-split painter n) + (if (= n 0) + painter + (let ((up (up-split painter (- n 1))) + (right (right-split painter (- n 1)))) + (let ((top-left up) + (bottom-right right) + (corner (corner-split painter (- n 1)))) + (beside (below painter top-left) + (below bottom-right corner)))))) +(paint (corner-split einstein 4)) + +(define (square-limit painter n) + (let ((s (lambda (f) + (lambda (painter) (f (corner-split (flip-horiz painter) n)))))) + ((square-of-four + (s flip-horiz) + (s (lambda (x) x)) + (s <-rotate180) + (s flip-vert)) + painter))) + +(paint (square-limit einstein 2)) diff --git a/coding-exercises/2/53.rkt b/coding-exercises/2/53.rkt new file mode 100644 index 0000000..791bcd6 --- /dev/null +++ b/coding-exercises/2/53.rkt @@ -0,0 +1,9 @@ +#lang racket + +(list 'a 'b 'c) +(list (list 'george)) +(cdr '((x1 x2) (y1 y2))) +(cadr '((x1 x2) (y1 y2))) +(pair? (car '(a short list))) +(memq 'red '((red shoes) (blue socks))) +(memq 'red '(red shoes blue socks)) diff --git a/coding-exercises/2/54.rkt b/coding-exercises/2/54.rkt new file mode 100644 index 0000000..c59a91a --- /dev/null +++ b/coding-exercises/2/54.rkt @@ -0,0 +1,4 @@ +#lang racket + +(equal? '(this is a list) '(this is a list)) +(equal? '(this is a list) '(this (is a) list)) diff --git a/shared/pict.rkt b/shared/pict.rkt index 6eb2e19..aa46f3c 100644 --- a/shared/pict.rkt +++ b/shared/pict.rkt @@ -15,9 +15,23 @@ start-segment end-segment paint - segments->painter) -(require sicp-pict) -(require "lists.rkt") + segments->painter + transform-painter + beside + einstein + flip-horiz + flip-vert + <-rotate180 + <-rotate270 + enumerate-corners + enumerate-segments + close-line + line-points->segments + up-split + right-split + below + square-of-four) +(require sicp-pict "lists.rkt") (define (xcor-vect v) (vector-xcor v)) @@ -54,3 +68,74 @@ (segment-start s)) (define (end-segment s) (segment-end s)) + +(define (flip-horiz painter) + (transform-painter + painter + (make-vect 1 0) + (make-vect 0 0) + (make-vect 1 1))) + +(define (flip-vert painter) + (transform-painter + painter + (make-vect 0 1) + (make-vect 1 1) + (make-vect 0 0))) + +(define (<-rotate180 painter) + (flip-horiz (flip-vert painter))) +(define (<-rotate270 painter) + (transform-painter + painter + (make-vect 0 1) + (make-vect 0 0) + (make-vect 1 1))) + + +(define (enumerate-corners frame) + (list + (origin-frame frame) + (edge1-frame frame) + (add-vect + (edge1-frame frame) + (edge2-frame frame)) + (edge2-frame frame))) + +(define (close-line line-points) + (append line-points (list (car line-points)))) + +(define (enumerate-segments frame) + (map + (lambda (pair) + (make-segment (car pair) (cadr pair))) + (enumerate-windows + (close-line (enumerate-corners frame)) + 2))) + +(define (line-points->segments points) + (map + (lambda (pair) + (make-segment (car pair) (cadr pair))) + (enumerate-windows + points + 2))) + + +(define (right-split painter n) + (if (= n 0) + painter + (let ((smaller (right-split painter (- n 1)))) + (beside smaller (below smaller smaller))))) + +(define (up-split painter n) + (if (= n 0) + painter + (let ((smaller (up-split painter (- n 1)))) + (below smaller (beside smaller smaller))))) + +(define (square-of-four tl tr bl br) + (lambda (painter) + (let ((t (beside (tl painter) (tr painter))) + (b (beside (bl painter) (br painter)))) + (below b t)))) |
