rendered paste body;; The first three lines of this file were inserted by DrRacket. They record metadata
;; about the language level of this file in a form that our tools can easily process.
#reader(lib "htdp-beginner-reader.ss" "lang")((modname |hw 2|) (read-case-sensitive #t) (teachpacks ((lib "image.ss" "teachpack" "2htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "image.ss" "teachpack" "2htdp")))))
;Design recipe:
;Data
;Signature, Purpose, Header
;Examples
;Template
;Body
;Tests
;1 Euclidean Distance
;direct-to-0: posn -> number
;Calcuates the distance between the given posn's location
;and the origin.
;Examples:
;(check-expect (direct-to-0 (make-posn 3 4) 5))
;(check-expect (direct-to-0 (make-posn 0 0) 0))
;(check-expect (direct-to-0 (make-posn 5 -12) 13))
;Template for direct-to-0:
;(define (direct-to-0 p)
;...(posn-x p)...
;...(posn-y p)...)
;The selectors in the template end up being used
;in the helper function, rather than this function directly.
(define (direct-to-0 p)
(direct-between p (make-posn 0 0)))
;Tests:
(check-expect (direct-to-0 (make-posn 3 4)) 5)
(check-expect (direct-to-0 (make-posn 0 0)) 0)
(check-expect (direct-to-0 (make-posn 5 -12)) 13)
;wishlist: direct-between
;direct-between: posn, posn -> number
;Calculates the distance between the location
;of the two given posn's.
;Examples:
;(check-expect (direct-between (make-posn 3 4)
; (make-posn 0 0)) 5)
;(check-expect (direct-between (make-posn 2 6)
; (make-posn 14 11)) 13)
;(check-expect (direct-between (make-posn -4 -3)
; (make-posn -1 1)) 5)
;Template for direct-between:
;(define (direct-between p1 p2)
;...(posn-x p1)...
;...(posn-x p2)...
;...(posn-y p1)...
;...(posn-y p2)...)
(define (direct-between p1 p2)
(expt (+ (expt (- (posn-x p1) (posn-x p2)) 2)
(expt (- (posn-y p1) (posn-y p2)) 2)) 0.5))
;Tests:
(check-expect (direct-between (make-posn 3 4)
(make-posn 0 0)) 5)
(check-expect (direct-between (make-posn 2 6)
(make-posn 14 11)) 13)
(check-expect (direct-between (make-posn -4 -3)
(make-posn -1 1)) 5)
;2 Zoo Animals
;a spider is:
;(make-spider number number)
(define-struct spider (legs space))
;spider template:
;(define (fun-for-spider s)
;...(spider-legs s)...
;...(spider-space s)...)
;an elephant is:
;(make-elephant number)
(define-struct elephant (space))
;elephant template:
;(define (fun-for-elephant e)
;...(elephant-space e)...)
;a monkey is:
;(make-spider number number)
(define-struct monkey (intellgience space))
;monkey template:
;(define (fun-for-monkey m)
;...(monkey-intelligence m)...
;...(monkey-space m)...)
;Template for zoo-animals
; (cond [(spider? a) (fun-for-spider a)]
; [(elephant? a) (fun-for-elephant a)]
; [(monkey? a) (fun-for-monkey a)]
;fits?: animal, number -> boolean
;Returns a boolean whether or not the cage is big enough to fit
;the animal.
;Examples:
;(check-expect (fits? (make-spider 5 30) 40) true)
;(check-expect (fits? (make-elephant 1000) 900) false)
;(check-expect (fits? (make-monkey 60 100) 100) true)
(define (fits? a cage)
(cond [(spider? a) (>= cage (spider-space a))]
[(elephant? a) (>= cage (elephant-space a))]
[(monkey? a) (>= cage (monkey-space a))]))
;Tests:
(check-expect (fits? (make-spider 5 30) 40) true)
(check-expect (fits? (make-elephant 1000) 900) false)
(check-expect (fits? (make-monkey 60 100) 100) true)
;(check-expect (fits? (make-spider 5 30) 40) true)
;(check-expect (fits? (make-elephant 1000) 900) false)
;(check-expect (fits? (make-monkey 60 100) 100) true)
;extra-leg-room: animal -> number
;Returns how much space the given animal needs to rest comfortably
;during transport.
;Examples:
;(check-expect (extra-leg-room (make-spider 8 30)) 33)
;(check-expect (extra-leg-room (make-elephant 1000)) 1200)
;(check-expect (extra-leg-room (make-monkey 70 150)) 300)
(define (extra-leg-room a)
(cond [(spider? a) (* 1.1 (spider-space a))]
[(elephant? a) (* 1.2 (elephant-space a))]
[(monkey? a) (* 2 (monkey-space a))]))
;Tests:
(check-expect (extra-leg-room (make-spider 8 30)) 33)
(check-expect (extra-leg-room (make-elephant 1000)) 1200)
(check-expect (extra-leg-room (make-monkey 70 150)) 300)
; a zoo is either
; - empty, or
; - (cons animal zoo)
;Template for zoo:
;(define (fun-for-zoo z)
;(cond [(empty? z) ...]
; [(cons? z) ... (first z) ... (fun-for-zoo (rest z)) ... ])
;some sample zoos, since we were not
;declared to actually make a zoo data structure
(define zoo1 (cons (make-spider 8 10)
(cons (make-elephant 1000) empty)))
(define zoo2 (cons (make-monkey 80 120)
(cons (make-elephant 1200) empty)))
;zoo-fits-comfortably?: zoo, number -> boolean
;Returns a boolean as to whether the given zoo can fit
;all the animals comfortably.
;Examples:
;(check-expect (zoo-fits-comfortably? (cons empty) 1 true))
;(check-expect (zoo-fits-comfortably? zoo1 1212) true)
;(check-expect (zoo-fits-comfortably? zoo2 1322) false)
(define (zoo-fits-comfortably? z cargo)
(<= (total-space-for-zoo-animals-to-be-comfortable z) cargo))
;Tests:
(check-expect (zoo-fits-comfortably? empty 1) true)
(check-expect (zoo-fits-comfortably? zoo1 1212) true)
(check-expect (zoo-fits-comfortably? zoo2 1322) false)
;wishlist:
;total-space-for-zoo-animals-to-be-comfortable
;total-space-for-zoo-animals-to-be-comfortable: zoo -> number
;Returns the total space neeed for all the of the given
;zoo's animals to be comfortable.
;Examples:
;(check-expect (total-space-for-zoo-animals-to-be-comfortable
; (cons empty)) 0)
;(check-expect (total-space-for-zoo-animals-to-be-comfortable
; zoo1) 1211)
;(check-expect (total-space-for-zoo-animals-to-be-comfortable
; zoo2) 1600)
(define (total-space-for-zoo-animals-to-be-comfortable z)
(cond [(empty? z) 0]
[else (+ (extra-leg-room (first z))
(total-space-for-zoo-animals-to-be-comfortable (rest z)))]))
;Tests:
(check-expect (total-space-for-zoo-animals-to-be-comfortable
empty) 0)
(check-expect (total-space-for-zoo-animals-to-be-comfortable
zoo1) 1211)
(check-expect (total-space-for-zoo-animals-to-be-comfortable
zoo2) 1680)