diff options
| -rw-r--r-- | coding-exercises/2/40.rkt | 42 | ||||
| -rw-r--r-- | coding-exercises/2/41.rkt | 19 | ||||
| -rw-r--r-- | coding-exercises/2/42.rkt | 44 | ||||
| -rw-r--r-- | coding-exercises/2/43.rkt | 2 | ||||
| -rw-r--r-- | coding-exercises/2/44.rkt | 2 | ||||
| -rw-r--r-- | shared/lists.rkt | 22 |
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))) + |
