summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coding-exercises/2/40.rkt42
-rw-r--r--coding-exercises/2/41.rkt19
-rw-r--r--coding-exercises/2/42.rkt44
-rw-r--r--coding-exercises/2/43.rkt2
-rw-r--r--coding-exercises/2/44.rkt2
-rw-r--r--shared/lists.rkt22
6 files changed, 130 insertions, 1 deletions
diff --git a/coding-exercises/2/40.rkt b/coding-exercises/2/40.rkt
new file mode 100644
index 0000000..cf71b5d
--- /dev/null
+++ b/coding-exercises/2/40.rkt
@@ -0,0 +1,42 @@
+#lang racket
+(require "../../shared/lists.rkt")
+(require "../../shared/chapter1.rkt")
+
+(define (enumerate-interval j k)
+ (define (iter i interval)
+ (if (< i j)
+ interval
+ (iter (- i 1) (cons i interval))))
+ (iter k '()))
+
+((lambda ()
+ (newline)
+ (display (enumerate-interval 2 5))))
+
+(define (unique-pairs n)
+ (flatmap
+ (lambda (i)
+ (map (lambda (j) (list j i))
+ (enumerate-interval 1 (- i 1))))
+ (enumerate-interval 1 n)))
+
+(define (prime? n)
+ (fermat? 2 n))
+(define (prime-sum? pair)
+ (prime? (+ (car pair) (cadr pair))))
+(define (make-pair-sum pair)
+ (list (car pair) (cadr pair)
+ (+ (car pair) (cadr pair))))
+(define (prime-sum-pairs n)
+ (map make-pair-sum
+ (filter prime-sum? (unique-pairs n))))
+
+((lambda ()
+ (display "unique-pairs")
+ (newline)
+ (display (unique-pairs 10))
+ (newline)
+ (display "prime-sum-pairs")
+ (newline)
+ (display (prime-sum-pairs 10))
+ (newline)))
diff --git a/coding-exercises/2/41.rkt b/coding-exercises/2/41.rkt
new file mode 100644
index 0000000..0871313
--- /dev/null
+++ b/coding-exercises/2/41.rkt
@@ -0,0 +1,19 @@
+#lang racket
+(require "../../shared/lists.rkt")
+
+(define (ordered-triples-sum n s)
+ (if (< n 3)
+ '()
+ (filter (lambda (triplet)
+ (= (fold-right + 0 triplet) s))
+ (flatmap (lambda (i)
+ (flatmap (lambda (pair)
+ (permutations (cons i pair)))
+ (unique-pairs (- i 1))))
+ (enumerate-interval 3 n)))))
+
+((lambda ()
+ (newline)
+ (display (enumerate-interval 3 3))
+ (newline)
+ (display (ordered-triples-sum 4 8))))
diff --git a/coding-exercises/2/42.rkt b/coding-exercises/2/42.rkt
new file mode 100644
index 0000000..eb1a5fc
--- /dev/null
+++ b/coding-exercises/2/42.rkt
@@ -0,0 +1,44 @@
+#lang racket
+(require "../../shared/lists.rkt")
+
+(define (adjoin-position new-row k rest-of-queens)
+ (cons (list new-row k) rest-of-queens))
+
+(define (safe? k positions)
+ (let ((maybe-new-queen (car positions))
+ (rest-of-queens (cdr positions)))
+ (fold-right (lambda (queen safe)
+ (let ((dx (abs (- (car queen) (car maybe-new-queen)))))
+ (and
+ safe
+ (not (or (= dx 0) (= dx (- k (cadr queen))))))))
+ true
+ rest-of-queens)))
+
+((lambda ()
+ (newline)
+ (display "safe?-test")
+ (newline)
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 0 0))))
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 1 0))))
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 2 0))))
+ (display (safe? 2 (list (list 5 2) (list 1 1) (list 3 0))))
+ (display (safe? 6 (list (list 6 6) (list 5 5) (list 4 4))))))
+
+(define empty-board '())
+
+(define (queens board-size)
+ (define (queen-cols k)
+ (if (= k 0)
+ (list empty-board)
+ (filter
+ (lambda (positions) (safe? k positions))
+ (flatmap
+ (lambda (rest-of-queens)
+ (map (lambda (new-row)
+ (adjoin-position new-row k rest-of-queens))
+ (enumerate-interval 1 board-size)))
+ (queen-cols (- k 1))))))
+ (queen-cols board-size))
+
+(length (queens 8))
diff --git a/coding-exercises/2/43.rkt b/coding-exercises/2/43.rkt
new file mode 100644
index 0000000..96b9373
--- /dev/null
+++ b/coding-exercises/2/43.rkt
@@ -0,0 +1,2 @@
+#lang racket
+(require "../../shared/lists.rkt")
diff --git a/coding-exercises/2/44.rkt b/coding-exercises/2/44.rkt
new file mode 100644
index 0000000..ae76481
--- /dev/null
+++ b/coding-exercises/2/44.rkt
@@ -0,0 +1,2 @@
+#lang racket
+(require sicp-pic)
diff --git a/shared/lists.rkt b/shared/lists.rkt
index 4f2184d..b721623 100644
--- a/shared/lists.rkt
+++ b/shared/lists.rkt
@@ -2,7 +2,9 @@
(provide accumulate
accumulate-n
fold-right
- fold-left)
+ fold-left
+ flatmap
+ enumerate-interval)
(define (append list1 list2)
(if (null? list1)
list2
@@ -48,3 +50,21 @@
(iter (op result (car rest))
(cdr rest))))
(iter initial sequence))
+
+(define (flatmap proc seq)
+ (accumulate append '() (map proc seq)))
+
+(define (enumerate-interval j k)
+ (define (iter i interval)
+ (if (< i j)
+ interval
+ (iter (- i 1) (cons i interval))))
+ (iter k '()))
+
+(define (unique-pairs n)
+ (flatmap
+ (lambda (i)
+ (map (lambda (j) (list j i))
+ (enumerate-interval 1 (- i 1))))
+ (enumerate-interval 1 n)))
+