|
|
Comp210: Principles of Computing and Programming
|
;; within-two?: number, number --> boolean
;; Are m,n less than 2 apart?
;; (Difference of exactly 2 returns false.)
;;
(define (within-two? m n)
(and (< (- m n) 2)
(< (- n m) 2)))
(within-two? 99.8 101)
true
(within-two? 5 -5)
false
(within-two? 7 7)
true
;; fastest-runner: nonnegative-number -> symbol
;; Given a distance to run (in meters),
;; return the fastest runner on the team.
;;
(define (fastest-runner distance)
(cond [(< distance 300) 'Marianne]
[(and (>= distance 300) (< distance 1000)) 'Becca]
[(and (>= distance 1000) (< distance 10000)) 'Suzy]
[>= distance 10000) 'Yvonne]))
"Test fastest-runner."
(symbol=? (fastest-runner 10000) 'Yvonne)
(symbol=? (fastest-runner 8000) 'Suzy)
(symbol=? (fastest-runner 2000) 'Suzy)
(symbol=? (fastest-runner 200) 'Marianne)
(symbol=? (fastest-runner 999) 'Becca)
;; lion-pop-later: nonnegative-number --> nonnegative-number
;; Given this year's lion-population,
;; returns next year's lion-population, according to the model specified on
;; Lab02)
;;
(define (lion-pop-later pop-now)
(cond ; Low population: 10% growth.
[(< pop-now 800) (* 1.1 pop-now)]
; Moderate population: 2% growth.
[(and (>= pop-now 800) (< pop-now 1100) (* 1.02 pop-now)]
; Overcrowding: -30% growth.
[(>= pop-now 1100) (* 0.7 pop-now)]))
"Test lion-pop-later"
(= (lion-pop-later 0) 0)
(= (lion-pop-later 100) 110)
(= (lion-pop-later 700) 770)
(= (lion-pop-later 800) 816)
(= (lion-pop-later 1100) 770)
(= (lion-pop-later 10000) 7000)
(define-struct ppg (name color ferocity ca?))
;
; A Powerpuff Girl ("ppg") is:
; (make-ppg symbol symbol number boolean)
; where name is the ppg's name,
; color is their color
; (presumably one of {'green,'blue,'red}, but perhaps different
; if new ppgs are ever created)
; ferocity is their ferocity index, a number.
; and ca? is whether or not they're conflict avoidant.
"Examples of ppgs"
(make-ppg 'Buttercup 'green 90 false)
(make-ppg 'Blossom 'red 70 false)
(make-ppg 'Bubbles 'blue 77 true)
;; negotiates-well?: ppg -> boolean
;; Given a powerpuff girl, would she make a good negotiator?
;;
(define (negotiates-well? a-ppg)
(< (ppg-ferocity a-ppg) 80))
"Test negotiates-well?:"
(negotiates-well? (make-ppg 'Buttercup 'green 90 false))
false
(negotiates-well? (make-ppg 'Blossom 'red 70 false))
true
(negotiates-well? (make-ppg 'Bubbles 'blue 77 true))
true
;;; Optional Challenge version:
;; negotiates-well-v2?: ppg -> boolean
;; Given a powerpuff girl, would she make a good negotiator?
;;
(define (negotiates-well-v2? a-ppg)
(or (ppg-ca? a-ppg)
(and (> 80 (ppg-ferocity a-ppg))
(> (ppg-ferocity a-ppg) 20)))) ; Alternately: (< 20 (ppg-ferocity a-ppg) 80)
#|
Using cond, this could be written with:
(cond [(ppg-ca? a-ppg) true]
[(>= (ppg-ferocity a-ppg) 80) false]
[(>= 20 (ppg-ferocity a-ppg)) false]
[else true])
Sorry for the weird phrasing of the >=; Unfortunately,
in .html files the less-than would get swallowed.
|#
(negotiates-well-v2? (make-ppg 'buttercup 'green 90 false))
false
(negotiates-well-v2? (make-ppg 'blossom 'red 70 false))
true
(negotiates-well-v2? (make-ppg 'bubbles 'blue 77 true))
true
; We want to test somebody who is a conflict-avoidant but
; not between 20 & 80 ferocity:
(negotiates-well-v2? (make-ppg 'didi 'rainbow 15 true))
true
; Also test ferocity below 20 and not avoidant:
(negotiates-well-v2? (make-ppg 'dexter 'white 10 false))
false
;; two-can-beat-up?: ppg, ppg, number --> boolean
;; Can two ppg's combined take on a villain with toughness "v-toughness"?
;;
(define (two-can-beat-up? p1 p2 v-toughness)
(>= (+ (ppg-ferocity p1) (ppg-ferocity p2))
v-toughness))
; Note: perhaps adding the ferocities is not a good
; model; perhaps there is synergy for increased ferocity,
; or diminishing returns as you add ferocity.
; Ah well, this is a good model for now,
; and we can tweak it later for increased reality.
"Test two-can-beat-up?"
(two-can-beat-up? (make-ppg 'buttercup 'green 90 false)
(make-ppg 'bubbles 'blue 77 true)
110)
true
; Test when villain is totally wimpy:
(two-can-beat-up? (make-ppg 'buttercup 'green 90 false)
(make-ppg 'bubbles 'blue 77 true)
23)
true
(two-can-beat-up? (make-ppg 'buttercup 'green 90 false)
(make-ppg 'bubbles 'blue 77 true)
190)
false
; Test when villain is between the two ppg's ferocity:
(two-can-beat-up? (make-ppg 'buttercup 'green 90 false)
(make-ppg 'bubbles 'blue 77 true)
84)
true
; Test when villain is exactly the sum of the two ppg's ferocity:
; (Presumably both sides succesfully beat each other up.)
(two-can-beat-up? (make-ppg 'buttercup 'green 90 false)
(make-ppg 'bubbles 'blue 77 true)
(+ 90 77))
true
;;--------------------------------------------------------------
"Optional Challenge problems"
"(further tests should be true, or instances of structs.)"
;;
(define-struct villain (name power always-hungry? iq weakness))
;;
;; A villain is:
;; (make-villain [symbol] [number] [boolean] [number] [symbol])
;; where power is the power-rating, iq is an IQ.
;; weakness describes the villain's achilles heel.
;; name and always-hungry? are self-evident.
; Examples of data:
(make-villain 'fuzzy-lumpkins 90 true 35 'witty-banter)
(make-villain 'mojo-jojo 35 false 190 'soliliquizing)
#|
;;;; TEMPLATE
;; villain-handler: villain --> ??
;;
(define (villain-handler a-villain)
..(villain-name a-villain) ..(villain-power a-villain)
..(villain-iq a-villain) ..(villain-always-hungry? a-villain)
..(villain-weakness a-villain) )
|#
;; can-handle?: ppg, villain -> boolean
;; returns whether a-ppg could handle a-villain, one-on-one.
;; Peaceful resolutions count as 'handling'.
;;
(define (can-handle? a-ppg a-villain)
(or (>= (ppg-ferocity a-ppg) (villain-power a-villain)) ; Combat resolution.
(and (ppg-ca? a-ppg) (> (villain-iq a-villain) 150)))) ; Negotiation.
(boolean=? (can-handle? (make-ppg 'bubbles 'blue 77 true)
(make-villain 'fuzzy-lumpkins 90 true 35 'witty-banter))
false)
(boolean=? (can-handle? (make-ppg 'bubbles 'blue 77 true)
(make-villain 'mojo-jojo 35 false 190 'soliliquizing))
true)
; More test cases needed, to be confident.
; Data definition:
; A Townsvillite is:
; - a ppg, or
; - a villain.
;; is-rash? : Townsvillite -> boolean
;; Is the Townsvillite prone to ill-considered, hot-tempered actions?
;;
(define (is-rash? townie)
(cond [(ppg? townie) (not (ppg-ca? townie))]
[(villain? townie) (> 120 (villain-iq townie))]
[else (error 'is-rash? "Expected a Townsvillite, got ~s." townie)]))
(boolean=? (is-rash? (make-ppg 'bubbles 'blue 77 true))
false)
(boolean=? (is-rash? (make-villain 'mojo-jojo 35 false 190 'soliliquizing))
false)
(boolean=? (is-rash? (make-villain 'fuzzy-lumpkins 90 true 35 'witty-banter))
true)
;; More test cases needed, to be confident.
(define-struct citizen (name gender))
; A Citizen is:
; (make-citizen [symbol] [symbol])
; where gender is one of {'male, 'female}.
; Example data:
(make-citizen 'mayor 'male)
(make-citizen 'teacher 'female) ;What is her name? Email ian@rice, thx.
;; Include citizen in the definition of Townsvillite,
;; and correspondingly update is-rash?:
; A Townsvillite is:
; - a ppg, or
; - a villain, or
; - a citizen.
;; is-rash? : Townsvillite -> boolean
;; Is the Townsvillite prone to ill-considered, hot-tempered actions?
;;
(define (is-rash? townie)
(cond [(ppg? townie) (not (ppg-ca? townie))]
[(villain? townie) (> 120 (villain-iq townie))]
;[(citizen? townie) false]
[(citizen? townie) false]
[else (error 'is-rash? "Expected a Townsvillite, got ~s." townie)]))
(boolean=? false (is-rash? (make-citizen 'mayor 'male)))
; Plus we should repeat the previous test-cases,
; to see if bugs were introduced.
(boolean=? (is-rash? (make-ppg 'bubbles 'blue 77 true))
false)
(boolean=? (is-rash? (make-villain 'mojo-jojo 35 false 190 'soliliquizing))
false)
(boolean=? (is-rash? (make-villain 'fuzzy-lumpkins 90 true 35 'witty-banter))
true)
Last Revised Friday, 03-Sep-2004 12:04:27 CDT
©2004 Stephen Wong and Dung Nguyen