All pastes #2106158 Raw Edit

hw 2

public text v1 · immutable
#2106158 ·published 2012-01-25 22:19 UTC
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)