Solutions to Assignments
2.2 (define (tip x)
(- (ceiling (* 1.15 x)) x))
2.4 (define (first-two wd)
(word (first wd) (first (bf wd))))
2.5 (define (query sent)
(se (first (bf sent)) (first sent) (bf (bf (bl sent))) (word (last sent) '?)))
3.1 (define (european-time time)
(cond ((equal? time '(12 am)) 24)
((equal? time '(12 pm)) 12)
((equal? (last time) 'am) (first time))
(else (+ (first time) 12))))
(define (describe-time time)
(cond ((>= time (* 60 60 24 365 100)) (se (/ time (* 60 60 24 365 100)) 'centuries))
((>= time (* 60 60 24 365)) (se (/ time (* 60 60 24 365)) 'years))
((>= time (* 60 60 24)) (se (/ time (* 60 60 24)) 'days))
((>= time (* 60 60)) (se (/ time (* 60 60)) 'hours))
((>= time 60) (se (/ time 60) 'minutes))
(else (se time 'seconds))))
(define (american-time time)
(cond ((= time 24) '(12 am))
((= time 12) '(12 pm))
((> time 12) (se (- time 12) 'pm))
(else (se time 'am))))
3.2 (define (sort2 sent)
(if (> (first sent) (last sent))
(se (last sent) (first sent))
sent))
3.3 (define (leap? yr)
(cond ((= (remainder yr 400) 0) #t)
((= (remainder yr 100) 0) #f)
((= (remainder yr 4) 0) #t)
(else #f)))
(define (valid-date? mon day yr)
(cond ((member? mon '(1 3 5 7 8 10 12)) (and (<= 1 day) (<= day 31)))
((member? mon '(4 6 9 11)) (and (<= 1 day) (<= day 30)))
((equal? mon 2) (if (leap? yr) (and (<= 1 day) (<= day 29)) (and (<= 1 day) (<= day 28))))
(else #f)))
3.4 (define (describe-time time)
(cond ((>= time (* 60 60 24 365 100)) (se (/ time (* 60 60 24 365 100)) 'centuries))
((>= time (* 60 60 24 365)) (se (/ time (* 60 60 24 365)) 'years))
((>= time (* 60 60 24)) (se (/ time (* 60 60 24)) 'days))
((>= time (* 60 60)) (se (/ time (* 60 60)) 'hours))
((>= time 60) (se (/ time 60) 'minutes))
(else (se time 'seconds))))
4.1 (define (hang-letter letter guesses)
(if (member? letter guesses)
letter
'-))
(define (hangman wd1 wd2)
(every (lambda(x) (hang-letter x wd2)) wd1))
4.2 (define (first-last sent)
(keep (lambda(wd) (equal? (first wd) (last wd))) sent))
4.3 (define (aplize proc)
(lambda(sent) (every proc sent)))
4.4 (define (initials sent)
(if (empty? sent)
'()
(se (first (first sent)) (initials (bf sent)))))
4.5 (define (countdown n)
(if (= n 0) '(BLASTOFF!)
(se n (countdown (- n 1)))))
5.1 (define (base-grade grade)
(cond ((equal? (first grade) 'A) 4)
((equal? (first grade) 'B) 3)
((equal? (first grade) 'C) 2)
((equal? (first grade) 'D) 1)
(else 0)))
(define (grade-modifier grade)
(cond ((equal? (last grade) '+) (+ (base-grade grade) 0.33))
((equal? (last grade) '-) (- (base-grade grade) 0.33))
(else (base-grade grade))))
(define (gpa-total gradesent)
(if (= (count gradesent) 1) (grade-modifier (first gradesent))
(+ (grade-modifier (first gradesent)) (gpa-total (bf gradesent)))))
(define (gpa gradesent)
(/ (gpa-total gradesent) (count gradesent)))
5.2 (define (spell-digit digit)
(item (+ 1 digit) '(zero one two three four five six seven eight nine)))
(define (spell-number num)
(if (= (count num) 1) (se (spell-digit num))
(se (spell-digit (first num)) (spell-number (bf num)))))
5.3 (define (remove wd sent)
(if (empty? sent) sent
(if (equal? wd (first sent)) (remove wd (bf sent))
(se (first sent) (remove wd (bf sent))))))
5.4 (define (desc-time time)
(cond ((>= time 3153600000) (se (quotient time 3153600000) 'centuries
(desc-time (remainder time 3153600000))))
((>= time 31536000) (se (quotient time 31536000) 'years (desc-time (remainder time 31536000))))
((>= time 86400) (se (quotient time 86400) 'days (desc-time (remainder time 86400))))
((>= time 3600) (se (quotient time 3600) 'hours (desc-time (remainder time 3600))))
((>= time 60) (se (quotient time 60) 'minutes (desc-time (remainder time 60))))
(else (se time 'seconds))))