fork download
  1. ; longest consecutive sequence of squares
  2.  
  3. (define (range . args)
  4. (case (length args)
  5. ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
  6. ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
  7. ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
  8. (let loop ((x(car args)) (xs '()))
  9. (if (le? (cadr args) x)
  10. (reverse xs)
  11. (loop (+ x (caddr args)) (cons x xs))))))
  12. (else (error 'range "unrecognized arguments"))))
  13.  
  14. (define (filter pred? xs)
  15. (let loop ((xs xs) (ys '()))
  16. (cond ((null? xs) (reverse ys))
  17. ((pred? (car xs))
  18. (loop (cdr xs) (cons (car xs) ys)))
  19. (else (loop (cdr xs) ys)))))
  20.  
  21. (define (squares n)
  22. (define (square x) (* x x))
  23. (let loop ((lo 1) (hi 1) (sum 1))
  24. (cond ((< n (* hi hi)) (list))
  25. ((< sum n) (loop lo (+ hi 1) (+ sum (square (+ hi 1)))))
  26. ((< n sum) (loop (+ lo 1) hi (- sum (square lo))))
  27. (else (list lo hi)))))
  28.  
  29. (define (sum-squares lo hi)
  30. (define (sum-squares n) (* n (+ n 1) (+ n n 1) 1/6))
  31. (- (sum-squares hi) (sum-squares (- lo 1))))
  32.  
  33. (display (squares 595)) (newline)
  34. (display (sum-squares 6 12)) (newline)
  35.  
  36. (display
  37. (map (lambda (xs) (sum-squares (car xs) (cadr xs)))
  38. (filter pair? (map squares (range 300)))))
Success #stdin #stdout 0.29s 8936KB
stdin
Standard input is empty
stdout
(6 12)
595
(1 4 5 9 13 14 16 25 29 30 36 41 49 50 54 55 61 64 77 81 85 86 90 91 100 110 113 121 126 135 139 140 144 145 149 169 174 181 190 194 196 199 203 204 221 225 230 245 255 256 265 271 280 284 285 289 294)