diff options
Diffstat (limited to 'scheme')
| -rw-r--r-- | scheme/001-multiples_of_3_or_5.scm | 20 | ||||
| -rw-r--r-- | scheme/002-even_fibonacci_numbers.scm | 33 | ||||
| -rw-r--r-- | scheme/utils.scm | 22 |
3 files changed, 75 insertions, 0 deletions
diff --git a/scheme/001-multiples_of_3_or_5.scm b/scheme/001-multiples_of_3_or_5.scm new file mode 100644 index 0000000..c329de9 --- /dev/null +++ b/scheme/001-multiples_of_3_or_5.scm @@ -0,0 +1,20 @@ +;;;; +;; Multiples of 3 or 5 +;; Problem 1 +;; +;; If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 +;; and 9. The sum of these multiples is 23. +;; Find the sum of all the multiples of 3 or 5 below 1000. +;;;; + +(load "utils.scm") + +(define +top+ 1000) + +(define result + (sum + (filter + (lambda (x) (or (= 0 (modulo x 3)) (= 0 (modulo x 5)))) + (range 1 +top+ 1)))) + +(display result) diff --git a/scheme/002-even_fibonacci_numbers.scm b/scheme/002-even_fibonacci_numbers.scm new file mode 100644 index 0000000..65b567d --- /dev/null +++ b/scheme/002-even_fibonacci_numbers.scm @@ -0,0 +1,33 @@ +;;;; +;; Even Fibonacci numbers +;; Problem 2 +;; +;; Each new term in the Fibonacci sequence is generated by adding the previous two terms. By +;; starting with 1 and 2, the first 10 terms will be: +;; 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... +;; By considering the terms in the Fibonacci sequence whose values do not exceed four +;; million, find the sum of the even-valued terms. +;;;; + +(load "utils.scm") + +(define +top+ 4000000) + +(define fib + (lambda (n) + (case n + ((0) 1) + ((1) 1) + (else (+ (fib (- n 1)) + (fib (- n 2))))))) + +(define result + (sum + (filter (lambda (x) (= 0 (modulo x 2))) + (do ((x 1 (+ x 1)) + (f 1 (fib x)) + (fs '())) + ((>= f +top+) fs) + (set! fs (cons f fs)))))) + +(display result) diff --git a/scheme/utils.scm b/scheme/utils.scm new file mode 100644 index 0000000..6ba98cd --- /dev/null +++ b/scheme/utils.scm @@ -0,0 +1,22 @@ +(define fold + (lambda (f acc xs) + (if (null? xs) + acc + (fold f (f acc (car xs)) (cdr xs))))) + +(define sum + (lambda (xs) (fold + 0 xs))) + +(define range + (lambda (start stop step) + (if (>= start stop) + '() + (cons start (range (+ start step) stop step))))) + +(define filter + (lambda (predicate xs) + (if (null? xs) + '() + (let* ((x (car xs)) + (filtered (filter predicate (cdr xs)))) + (if (predicate x) (cons x filtered) filtered))))) |
