Blame


1 665c255d 2023-08-04 jrmu (define (smallest-divisor n)
2 665c255d 2023-08-04 jrmu (find-divisor n 2))
3 665c255d 2023-08-04 jrmu (define (find-divisor n test-divisor)
4 665c255d 2023-08-04 jrmu (cond ((> (square test-divisor) n) n)
5 665c255d 2023-08-04 jrmu (( divides? test-divisor n) test-divisor)
6 665c255d 2023-08-04 jrmu (else (find-divisor n (+ test-divisor 1)))))
7 665c255d 2023-08-04 jrmu (define (divides? a b)
8 665c255d 2023-08-04 jrmu (= (remainder b a) 0))
9 665c255d 2023-08-04 jrmu (define (prime? n)
10 665c255d 2023-08-04 jrmu (= n (smallest-divisor n)))
11 665c255d 2023-08-04 jrmu (define (flatmap proc seq)
12 665c255d 2023-08-04 jrmu (accumulate append '() (map proc seq)))
13 665c255d 2023-08-04 jrmu (define (accumulate op initial seq)
14 665c255d 2023-08-04 jrmu (if (null? seq)
15 665c255d 2023-08-04 jrmu initial
16 665c255d 2023-08-04 jrmu (op (car seq)
17 665c255d 2023-08-04 jrmu (accumulate op initial (cdr seq)))))
18 665c255d 2023-08-04 jrmu (define (enumerate-interval low high)
19 665c255d 2023-08-04 jrmu (if (> low high)
20 665c255d 2023-08-04 jrmu '()
21 665c255d 2023-08-04 jrmu (cons low (enumerate-interval (1+ low) high))))
22 665c255d 2023-08-04 jrmu (define (prime-sum? pair)
23 665c255d 2023-08-04 jrmu (prime? (+ (car pair) (cadr pair))))
24 665c255d 2023-08-04 jrmu (define (make-pair-sum pair)
25 665c255d 2023-08-04 jrmu (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))
26 665c255d 2023-08-04 jrmu (define (prime-sum-pairs n)
27 665c255d 2023-08-04 jrmu (map make-pair-sum
28 665c255d 2023-08-04 jrmu (filter prime-sum?
29 665c255d 2023-08-04 jrmu (flatmap
30 665c255d 2023-08-04 jrmu (lambda (i)
31 665c255d 2023-08-04 jrmu (map
32 665c255d 2023-08-04 jrmu (lambda (j)
33 665c255d 2023-08-04 jrmu (list i j))
34 665c255d 2023-08-04 jrmu (enumerate-interval 1 (- i 1)))
35 665c255d 2023-08-04 jrmu (enumerate-interval 1 n))))))
36 665c255d 2023-08-04 jrmu (define (permutations s)
37 665c255d 2023-08-04 jrmu (if (null? s)
38 665c255d 2023-08-04 jrmu '(())
39 665c255d 2023-08-04 jrmu (flatmap (lambda (x)
40 665c255d 2023-08-04 jrmu (map (lambda (p) (cons x p))
41 665c255d 2023-08-04 jrmu (permutations (remove x s))))
42 665c255d 2023-08-04 jrmu s)))
43 665c255d 2023-08-04 jrmu (define (remove item sequence)
44 665c255d 2023-08-04 jrmu (filter (lambda (x) (not (= x item)))
45 665c255d 2023-08-04 jrmu sequence))
46 665c255d 2023-08-04 jrmu (define (unique-pairs n)
47 665c255d 2023-08-04 jrmu (flatmap
48 665c255d 2023-08-04 jrmu (lambda (i)
49 665c255d 2023-08-04 jrmu (map (lambda (j)
50 665c255d 2023-08-04 jrmu (list i j))
51 665c255d 2023-08-04 jrmu (enumerate-interval 1 (- i 1))))
52 665c255d 2023-08-04 jrmu (enumerate-interval 1 n)))
53 665c255d 2023-08-04 jrmu (define (prime-sum-pairs n)
54 665c255d 2023-08-04 jrmu (map make-pair-sum
55 665c255d 2023-08-04 jrmu (filter
56 665c255d 2023-08-04 jrmu prime-sum?
57 665c255d 2023-08-04 jrmu (unique-pairs n))))
58 665c255d 2023-08-04 jrmu
59 665c255d 2023-08-04 jrmu ;; (prime-sum-pairs 10)
60 665c255d 2023-08-04 jrmu
61 665c255d 2023-08-04 jrmu ;; Exercise 2.41. Write a procedure to find all ordered triples of distinct positive integers i, j, and k less than or equal to a given integer n that sum to a given integer s.
62 665c255d 2023-08-04 jrmu
63 665c255d 2023-08-04 jrmu ;; 1 <= k < j < i <= n
64 665c255d 2023-08-04 jrmu (define (triples n sum)
65 665c255d 2023-08-04 jrmu (define (triple-sum? lst)
66 665c255d 2023-08-04 jrmu (= (+ (car lst)
67 665c255d 2023-08-04 jrmu (cadr lst)
68 665c255d 2023-08-04 jrmu (caddr lst)) sum))
69 665c255d 2023-08-04 jrmu (filter triple-sum?
70 665c255d 2023-08-04 jrmu (flatmap (lambda (i)
71 665c255d 2023-08-04 jrmu (flatmap (lambda (j)
72 665c255d 2023-08-04 jrmu (map (lambda (k)
73 665c255d 2023-08-04 jrmu (list i j k))
74 665c255d 2023-08-04 jrmu (enumerate-interval 1 (- j 1))))
75 665c255d 2023-08-04 jrmu (enumerate-interval 1 (- i 1))))
76 665c255d 2023-08-04 jrmu (enumerate-interval 1 n))))
77 665c255d 2023-08-04 jrmu
78 665c255d 2023-08-04 jrmu (triples 10 12)
79 665c255d 2023-08-04 jrmu