]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex3_70.rkt
Solution to 4.33. This had been difficult to get right, though conceptually it was
[sicp.git] / src / sicp / ex3_70.rkt
1 #lang racket
2
3 (define (merge-weighted p1 p2 weightfn)
4   (cond ((stream-null? p1) p2)
5         ((stream-null? p2) p1)
6         (else
7          (let ((p1car (stream-car p1))
8                (p2car (stream-car p2)))
9            (let ((w1 (weightfn (car p1car) (car (cdr p1car))))
10                  (w2 (weightfn (car p2car) (car (cdr p2car)))))
11              (cond ((< w1 w2)
12                     (cons-stream p1car 
13                                  (merge-weighted (stream-cdr p1) p2 weightfn)))
14                    ((> w1 w2)
15                     (cons-stream p2car
16                                  (merge-weighted p1 (stream-cdr p2) weightfn)))
17                    (else
18                     (cons-stream p1car
19                                  (cons-stream p2car
20                                               (merge-weighted (stream-cdr p1)
21                                                               (stream-cdr p2)
22                                                               weightfn))))))))))
23
24
25 (define (weighted-pairs s t weightfn)
26   (cons-stream
27    (list (stream-car s) (stream-car t))
28    (merge-weighted
29     (stream-map (lambda (x) (list (stream-car s) x))
30                 (stream-cdr t))
31     (weighted-pairs (stream-cdr s) (stream-cdr t) weightfn)
32     weightfn)))
33
34 #|
35
36 > (display-stream (weighted-pairs integers integers (lambda (i j) (+ i j))))
37
38 (1 1)
39 (1 2)
40 (1 3)
41 (2 2)
42 (1 4)
43 (2 3)
44 (1 5)
45 (2 4)
46 (3 3)
47 (1 6)
48 (2 5)
49 (3 4)
50 (1 7)
51 (2 6)
52 (3 5)
53 (4 4)
54 (1 8)
55 (2 7)
56 (3 6)
57 (4 5)
58 (1 9)
59 (2 8)
60 (3 7)
61 (4 6)
62 (5 5)
63 (1 10)
64 (2 9)
65 (3 8)
66 (4 7)
67 (5 6)
68 (1 11)
69 (2 10)
70 (3 9)
71 (4 8)
72 (5 7)
73 (6 6)
74 (1 12)
75 (2 11)
76 (3 10)
77 (4 9)
78 (5 8)
79 (6 7)
80 (1 13)
81 (2 12)
82 (3 11)
83 (4 10)
84 (5 9)
85 (6 8)
86 (7 7)
87 (1 14)
88 (2 13)
89 (3 12)
90 (4 11)
91 (5 10)
92 (6 9)
93 (7 8)
94 (1 15)
95 (2 14)
96 (3 13)
97 (4 12)
98 (5 11)
99 (6 10)
100 (7 9)
101 (8 8)
102 (1 16)
103 (2 15)
104 (3 14)
105
106 |#
107
108 ;; part 2.
109
110
111 (display-stream (stream-filter (lambda (p) 
112                                  (let ((i (car p)) 
113                                        (j (car (cdr p)))) 
114                                    (not (or (divides? 2 i)
115                                             (divides? 2 j)
116                                             (divides? 3 i)
117                                             (divides? 3 j)
118                                             (divides? 5 i)
119                                             (divides? 5 j)))))
120                                (weighted-pairs integers integers (lambda (i j) (+ (* 2 i) (* 3 j) (* 5 i j))))))
121
122 #|
123
124 (1 1)
125 (1 7)
126 (1 11)
127 (1 13)
128 (1 17)
129 (1 19)
130 (1 23)
131 (1 29)
132 (1 31)
133 (7 7)
134 (1 37)
135 (1 41)
136 (1 43)
137 (1 47)
138 (1 49)
139 (1 53)
140 (7 11)
141 (1 59)
142 (1 61)
143 (7 13)
144 (1 67)
145 (1 71)
146 (1 73)
147 (1 77)
148 (1 79)
149 (7 17)
150 (11 11)
151 (1 83)
152 (1 89)
153 (1 91)
154 (7 19)
155 (11 13)
156 (1 97)
157 (1 101)
158 (1 103)
159 (1 107)
160 (1 109)
161 (7 23)
162 (1 113)
163 (13 13)
164 (1 119)
165 (1 121)
166 (11 17)
167 (1 127)
168 (1 131)
169 (1 133)
170 (1 137)
171 (1 139)
172 (7 29)
173 (11 19)
174 (1 143)
175 (13 17)
176 (7 31)
177 (1 149)
178 (1 151)
179 (1 157)
180 (1 161)
181 (1 163)
182 (13 19)
183 (1 167)
184 (1 169)
185 (11 23)
186 (1 173)
187 (7 37)
188 (1 179)
189 (1 181)
190 (1 187)
191 (1 191)
192 (17 17)
193 (1 193)
194 (7 41)
195 (1 197)
196 (13 23)
197 (1 199)
198 (1 203)
199 (7 43)
200 (1 209)
201 (1 211)
202 (11 29)
203 (17 19)
204 (1 217)
205 (1 221)
206 (1 223)
207 (7 47)
208 (1 227)
209 (11 31)
210 (1 229)
211 (1 233)
212 (7 49)
213 (19 19)
214 (1 239)
215 (1 241)
216 (1 247)
217 (13 29)
218 (1 251)
219 (1 253)
220 (7 53)
221 (1 257)
222 (17 23)
223 (1 259)
224 (1 263)
225 (13 31)
226 (1 269)
227 (11 37)
228 (1 271)
229 (1 277)
230 (1 281)
231 (7 59)
232 (1 283)
233 (19 23)
234 (1 287)
235 (1 289)
236 (7 61)
237 (1 293)
238 (1 299)
239 (11 41)
240 (1 301)
241 (1 307)
242 (1 311)
243 (1 313)
244 (11 43)
245 (1 317)
246 (13 37)
247 (1 319)
248 (7 67)
249
250 |#