--- /dev/null
+#lang racket
+
+(define (merge-weighted p1 p2 weightfn)
+ (cond ((stream-null? p1) p2)
+ ((stream-null? p2) p1)
+ (else
+ (let ((p1car (stream-car p1))
+ (p2car (stream-car p2)))
+ (let ((w1 (weightfn (car p1car) (car (cdr p1car))))
+ (w2 (weightfn (car p2car) (car (cdr p2car)))))
+ (cond ((< w1 w2)
+ (cons-stream p1car
+ (merge-weighted (stream-cdr p1) p2 weightfn)))
+ ((> w1 w2)
+ (cons-stream p2car
+ (merge-weighted p1 (stream-cdr p2) weightfn)))
+ (else
+ (cons-stream p1car
+ (cons-stream p2car
+ (merge-weighted (stream-cdr p1)
+ (stream-cdr p2)
+ weightfn))))))))))
+
+
+(define (weighted-pairs s t weightfn)
+ (cons-stream
+ (list (stream-car s) (stream-car t))
+ (merge-weighted
+ (stream-map (lambda (x) (list (stream-car s) x))
+ (stream-cdr t))
+ (weighted-pairs (stream-cdr s) (stream-cdr t) weightfn)
+ weightfn)))
+
+#|
+
+> (display-stream (weighted-pairs integers integers (lambda (i j) (+ i j))))
+
+(1 1)
+(1 2)
+(1 3)
+(2 2)
+(1 4)
+(2 3)
+(1 5)
+(2 4)
+(3 3)
+(1 6)
+(2 5)
+(3 4)
+(1 7)
+(2 6)
+(3 5)
+(4 4)
+(1 8)
+(2 7)
+(3 6)
+(4 5)
+(1 9)
+(2 8)
+(3 7)
+(4 6)
+(5 5)
+(1 10)
+(2 9)
+(3 8)
+(4 7)
+(5 6)
+(1 11)
+(2 10)
+(3 9)
+(4 8)
+(5 7)
+(6 6)
+(1 12)
+(2 11)
+(3 10)
+(4 9)
+(5 8)
+(6 7)
+(1 13)
+(2 12)
+(3 11)
+(4 10)
+(5 9)
+(6 8)
+(7 7)
+(1 14)
+(2 13)
+(3 12)
+(4 11)
+(5 10)
+(6 9)
+(7 8)
+(1 15)
+(2 14)
+(3 13)
+(4 12)
+(5 11)
+(6 10)
+(7 9)
+(8 8)
+(1 16)
+(2 15)
+(3 14)
+
+|#
+
+;; part 2.
+
+
+(display-stream (stream-filter (lambda (p)
+ (let ((i (car p))
+ (j (car (cdr p))))
+ (not (or (divides? 2 i)
+ (divides? 2 j)
+ (divides? 3 i)
+ (divides? 3 j)
+ (divides? 5 i)
+ (divides? 5 j)))))
+ (weighted-pairs integers integers (lambda (i j) (+ (* 2 i) (* 3 j) (* 5 i j))))))
+
+#|
+
+(1 1)
+(1 7)
+(1 11)
+(1 13)
+(1 17)
+(1 19)
+(1 23)
+(1 29)
+(1 31)
+(7 7)
+(1 37)
+(1 41)
+(1 43)
+(1 47)
+(1 49)
+(1 53)
+(7 11)
+(1 59)
+(1 61)
+(7 13)
+(1 67)
+(1 71)
+(1 73)
+(1 77)
+(1 79)
+(7 17)
+(11 11)
+(1 83)
+(1 89)
+(1 91)
+(7 19)
+(11 13)
+(1 97)
+(1 101)
+(1 103)
+(1 107)
+(1 109)
+(7 23)
+(1 113)
+(13 13)
+(1 119)
+(1 121)
+(11 17)
+(1 127)
+(1 131)
+(1 133)
+(1 137)
+(1 139)
+(7 29)
+(11 19)
+(1 143)
+(13 17)
+(7 31)
+(1 149)
+(1 151)
+(1 157)
+(1 161)
+(1 163)
+(13 19)
+(1 167)
+(1 169)
+(11 23)
+(1 173)
+(7 37)
+(1 179)
+(1 181)
+(1 187)
+(1 191)
+(17 17)
+(1 193)
+(7 41)
+(1 197)
+(13 23)
+(1 199)
+(1 203)
+(7 43)
+(1 209)
+(1 211)
+(11 29)
+(17 19)
+(1 217)
+(1 221)
+(1 223)
+(7 47)
+(1 227)
+(11 31)
+(1 229)
+(1 233)
+(7 49)
+(19 19)
+(1 239)
+(1 241)
+(1 247)
+(13 29)
+(1 251)
+(1 253)
+(7 53)
+(1 257)
+(17 23)
+(1 259)
+(1 263)
+(13 31)
+(1 269)
+(11 37)
+(1 271)
+(1 277)
+(1 281)
+(7 59)
+(1 283)
+(19 23)
+(1 287)
+(1 289)
+(7 61)
+(1 293)
+(1 299)
+(11 41)
+(1 301)
+(1 307)
+(1 311)
+(1 313)
+(11 43)
+(1 317)
+(13 37)
+(1 319)
+(7 67)
+
+|#
\ No newline at end of file
--- /dev/null
+#lang racket
+
+(define (stream-duplicates s)
+ (if (= (stream-car s) (stream-car (stream-cdr s)))
+ (cons-stream (stream-car s)
+ (stream-duplicates (stream-cdr s)))
+ (stream-duplicates (stream-cdr s))))
+
+(define (cube-sum i j)
+ (+ (* i i i) (* j j j)))
+
+(display-stream (stream-duplicates (stream-map (lambda (p)
+ (cube-sum (car p) (car (cdr p))))
+ (weighted-pairs integers integers cube-sum))))
\ No newline at end of file
--- /dev/null
+#lang racket
+
+(define (stream-triplicates s)
+ (if (= (stream-car s) (stream-car (stream-cdr s)) (stream-car (stream-cdr (stream-cdr s))))
+ (cons-stream (stream-car s)
+ (stream-triplicates (stream-cdr (stream-cdr s))))
+ (stream-triplicates (stream-cdr s))))
+
+(define (square-sum i j)
+ (+ (* i i) (* j j)))
+
+(display-stream (stream-triplicates (stream-map (lambda (p)
+ (square-sum (car p) (car (cdr p))))
+ (weighted-pairs integers integers square-sum))))
+
+#|
+
+325
+425
+650
+725
+845
+850
+925
+1025
+1105
+1250
+1300
+1325
+1445
+1450
+1525
+1625
+1690
+1700
+1825
+1850
+1885
+2050
+2125
+2210
+2225
+2405
+2425
+2465
+2525
+2600
+2650
+2665
+
+|#
\ No newline at end of file