summaryrefslogtreecommitdiff
path: root/coding-exercises
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises')
-rw-r--r--coding-exercises/2/10.rkt5
-rw-r--r--coding-exercises/2/11.rkt90
-rw-r--r--coding-exercises/2/12.rkt29
-rw-r--r--coding-exercises/2/13.rkt10
-rw-r--r--coding-exercises/2/14.rkt66
-rw-r--r--coding-exercises/2/7.rkt8
-rw-r--r--coding-exercises/2/8.rkt4
-rw-r--r--coding-exercises/2/9.rkt9
8 files changed, 199 insertions, 22 deletions
diff --git a/coding-exercises/2/10.rkt b/coding-exercises/2/10.rkt
index 20c70b0..ae68781 100644
--- a/coding-exercises/2/10.rkt
+++ b/coding-exercises/2/10.rkt
@@ -1,8 +1,5 @@
#lang racket
-(require
- "7.rkt"
- "8.rkt"
- "9.rkt")
+(require "../../shared/intervals.rkt")
(define (div-interval x y)
(if (and (< 0 (lower-bound y)) (> 0 (upper-bound y)))
diff --git a/coding-exercises/2/11.rkt b/coding-exercises/2/11.rkt
new file mode 100644
index 0000000..d81d33a
--- /dev/null
+++ b/coding-exercises/2/11.rkt
@@ -0,0 +1,90 @@
+#lang racket
+(require "../../shared/intervals.rkt")
+
+;; Could be written to use less comparisons with nested cond, but this is more readable.
+(define (pos? x)
+ (> x 0))
+(define (neg? x)
+ (< x 0))
+(define (mul-interval x y)
+ (cond
+ ;; 1. all positive
+ ((and
+ (pos? (lower-bound x))
+ (pos? (lower-bound y))
+ (pos? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval (* (lower-bound x) (lower-bound y))
+ (* (upper-bound x) (upper-bound y))))
+ ;; 2. one lower-bound neg
+ ((and
+ (neg? (lower-bound x))
+ (pos? (lower-bound y))
+ (pos? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval (* (lower-bound x) (upper-bound y))
+ (* (upper-bound x) (upper-bound y))))
+ ;; 3. one lower-bound neg
+ ((and
+ (pos? (lower-bound x))
+ (neg? (lower-bound y))
+ (pos? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval (* (upper-bound x) (lower-bound y))
+ (* (upper-bound x) (upper-bound y))))
+ ;; 4. one interval neg
+ ((and
+ (neg? (lower-bound x))
+ (pos? (lower-bound y))
+ (neg? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval (* (upper-bound x) (upper-bound y))
+ (* (lower-bound x) (lower-bound y))))
+ ;; 5. one interval neg
+ ((and
+ (pos? (lower-bound x))
+ (neg? (lower-bound y))
+ (pos? (upper-bound x))
+ (neg? (upper-bound y)))
+ (make-interval (* (upper-bound x) (upper-bound y))
+ (* (lower-bound x) (lower-bound y))))
+ ;; 6. one interval neg, one interval crossing zero
+ ((and
+ (neg? (lower-bound x))
+ (neg? (lower-bound y))
+ (neg? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval (* (upper-bound x) (upper-bound y))
+ (* (upper-bound x) (lower-bound y))))
+ ;; 7. one interval neg, one interval crossing zero
+ ((and
+ (neg? (lower-bound x))
+ (neg? (lower-bound y))
+ (pos? (upper-bound x))
+ (neg? (upper-bound y)))
+ (make-interval (* (upper-bound x) (upper-bound y))
+ (* (upper-bound x) (lower-bound y))))
+ ;; 8. all neg
+ ((and
+ (neg? (lower-bound x))
+ (neg? (lower-bound y))
+ (neg? (upper-bound x))
+ (neg? (upper-bound y)))
+ (make-interval (* (lower-bound x) (lower-bound y))
+ (* (upper-bound x) (upper-bound y))))
+ ;; 9. both crossing zero
+ ((and
+ (neg? (lower-bound x))
+ (neg? (lower-bound y))
+ (pos? (upper-bound x))
+ (pos? (upper-bound y)))
+ (make-interval ((lambda (a b) (if (< a b) a b))
+ (* (lower-bound x) (upper-bound y))
+ (* (upper-bound x) (lower-bound y)))
+ ((lambda (a b) (if (> a b) a b))
+ (* (upper-bound x) (upper-bound y))
+ (* (lower-bound x) (lower-bound y)))))))
+
+(mul-interval
+ (make-interval -3 3)
+ (make-interval -4 4))
diff --git a/coding-exercises/2/12.rkt b/coding-exercises/2/12.rkt
new file mode 100644
index 0000000..c977436
--- /dev/null
+++ b/coding-exercises/2/12.rkt
@@ -0,0 +1,29 @@
+#lang racket
+(require "../../shared/intervals.rkt")
+
+(define (make-center-width c w)
+ (make-interval (- c w) (+ c w)))
+
+(define (center i)
+ (/ (+ (lower-bound i) (upper-bound i)) 2))
+
+(define (make-center-percent c p)
+ (let ((toler (* c (/ p 100.0))))
+ ((lambda (a b)
+ (if (> a b)
+ (make-interval b a)
+ (make-interval a b)))
+ (- c toler)
+ (+ c toler))))
+
+(define (percent i)
+ (abs (* 100 (/ (width i) (center i)))))
+
+(define (print)
+ (define t (make-center-width 10.0 6.1))
+ (define tp (make-center-percent -10.0 50.0))
+ (print-interval t)
+ (print-interval tp)
+ (println (percent t))
+ (println (percent tp)))
+(print)
diff --git a/coding-exercises/2/13.rkt b/coding-exercises/2/13.rkt
new file mode 100644
index 0000000..bc4cf09
--- /dev/null
+++ b/coding-exercises/2/13.rkt
@@ -0,0 +1,10 @@
+#lang racket
+(require "../../shared/intervals.rkt")
+
+(define (print)
+ (let ((i1 (make-center-percent 12.0 5.0))
+ (i2 (make-center-percent 12.0 5.0)))
+ (print-interval (mul-interval i1 i2))
+ (println (percent (mul-interval i1 i2)))))
+
+(print)
diff --git a/coding-exercises/2/14.rkt b/coding-exercises/2/14.rkt
new file mode 100644
index 0000000..50d28fc
--- /dev/null
+++ b/coding-exercises/2/14.rkt
@@ -0,0 +1,66 @@
+#lang racket
+(require "../../shared/intervals.rkt")
+
+(define (print-interval-percent i)
+ (newline)
+ (display "interval{")
+ (display (center i))
+ (display ",")
+ (display (percent i))
+ (display "}")
+ (newline))
+
+(define (lem1 i1 i2)
+ (div-interval (mul-interval i1 i2)
+ (add-interval i1 i2)))
+
+(define (lem2 i1 i2)
+ (let ((one (make-center-percent 1.0 0)))
+ (div-interval
+ one
+ (add-interval
+ (div-interval one i1)
+ (div-interval one i2)))))
+
+;; adding scales the heighest percent to the new center
+(define (print-add)
+ (let ((i1 (make-center-percent 100.0 2.0))
+ (i2 (make-center-percent 200.0 3.0)))
+ (newline)
+ (println "*** add")
+ (print-interval-percent i1)
+ (print-interval-percent i2)
+ (print-interval-percent (add-interval i1 i1))
+ (print-interval-percent (add-interval i1 i2))
+ (print-interval-percent (sub-interval i1 i1))
+ (print-interval-percent (sub-interval i1 i2))))
+
+;; multiplication and addition of positive intervals
+;; adds percentage from both intervals
+(define (print-mul)
+ (let ((i1 (make-interval 2.0 8.0))
+ (i2 (make-interval 2.0 8.0)))
+ (newline)
+ (println "*** mul")
+ (print-interval-percent i1)
+ (print-interval-percent i2)
+ (print-interval-percent (div-interval i1 i1))
+ (print-interval-percent (div-interval i1 i2))
+ (print-interval-percent (mul-interval i1 i1))
+ (print-interval-percent (mul-interval i1 i2))))
+
+;; There are at least some problems as I understand:
+;; 1. Repeated intervals in an equation are dependent on each other
+;; 2. Multiplicative identity is undefined and should not be uncertain
+(define (print-lem)
+ (let ((i1 (make-center-percent 100.0 2.0))
+ (i2 (make-center-percent 200.0 3.0)))
+ (newline)
+ (println "*** lem")
+ (print-interval-percent i1)
+ (print-interval-percent i2)
+ (print-interval-percent (lem1 i1 i2))
+ (print-interval-percent (lem2 i1 i2))))
+(print-add)
+(print-mul)
+(print-lem)
diff --git a/coding-exercises/2/7.rkt b/coding-exercises/2/7.rkt
index 13f28a6..462a58e 100644
--- a/coding-exercises/2/7.rkt
+++ b/coding-exercises/2/7.rkt
@@ -1,12 +1,4 @@
#lang racket
-(provide
- make-interval
- upper-bound
- lower-bound
- add-interval
- mul-interval
- div-interval
- print-interval)
(define (add-interval x y)
(make-interval (+ (lower-bound x) (lower-bound y))
diff --git a/coding-exercises/2/8.rkt b/coding-exercises/2/8.rkt
index 1a205fd..61ea92c 100644
--- a/coding-exercises/2/8.rkt
+++ b/coding-exercises/2/8.rkt
@@ -1,7 +1,5 @@
#lang racket
-(provide
- sub-interval)
-(require "7.rkt")
+(require "../../shared/intervals.rkt")
(define (sub-interval x y)
(make-interval (- (lower-bound x) (upper-bound y))
diff --git a/coding-exercises/2/9.rkt b/coding-exercises/2/9.rkt
index 0525802..e85b77d 100644
--- a/coding-exercises/2/9.rkt
+++ b/coding-exercises/2/9.rkt
@@ -1,14 +1,9 @@
#lang racket
-(provide
- width)
-(require
- "7.rkt"
- "8.rkt"
- "9.rkt")
+(require "../../shared/intervals.rkt")
(define (width x)
(/ (- (upper-bound x) (lower-bound x)) 2))
-
+
(define (print-sum)
(newline)
(println "*** (width SUM) == (SUM width) ***")