fork download
  1. ;; Generate Pythagorean triples using combinations. (1.04)
  2. ;; @see RhRctK
  3.  
  4. (use-modules (srfi srfi-1) ; pair-for-each
  5. (srfi srfi-67) ; list-compare
  6. (ice-9 format)) ; advanced formatting
  7.  
  8. ;; Combinations.
  9.  
  10. (define (combinations sequence k yield)
  11. (let loop ((start sequence) (k k) (result '()))
  12. (if (zero? k)
  13. (yield (reverse result))
  14. (pair-for-each (lambda (rest)
  15. (loop (cdr rest) (- k 1) (cons (car rest) result)))
  16. start))))
  17.  
  18. ;; Pythagorean triples.
  19.  
  20. (define (primitive-pythagorean-triple? x y z)
  21. (and (< x y z)
  22. (= (+ (* x x) (* y y)) (* z z))
  23. (= (gcd x y z) 1)))
  24.  
  25. (define (pythagorean-triples n)
  26. (let* ((out '())
  27. (collect (lambda (v)
  28. (apply (lambda (x y z)
  29. (when (primitive-pythagorean-triple? x y z)
  30. (set! out (cons v out))))
  31. v))))
  32. (combinations (iota n 1) 3 collect)
  33. (reverse out)))
  34.  
  35. ;; Main.
  36.  
  37. (define (list-less-reverse x y)
  38. (< (list-compare (reverse x) (reverse y)) 0))
  39.  
  40. (for-each (lambda (v)
  41. (format #t "(~{~2D~^ ~})~%" v))
  42. (sort (pythagorean-triples 97) list-less-reverse))
Success #stdin #stdout 0.53s 12692KB
stdin
Standard input is empty
stdout
( 3  4  5)
( 5 12 13)
( 8 15 17)
( 7 24 25)
(20 21 29)
(12 35 37)
( 9 40 41)
(28 45 53)
(11 60 61)
(33 56 65)
(16 63 65)
(48 55 73)
(36 77 85)
(13 84 85)
(39 80 89)
(65 72 97)