aboutsummaryrefslogtreecommitdiff
path: root/scheme
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-07-27 11:37:47 +0200
committerCharles Cabergs <me@cacharle.xyz>2021-07-27 11:37:47 +0200
commit726c5ce4decbcd354aff50d1a486bca8c2fa33c1 (patch)
treee96850f51e63789d6dcba3470de1258ec9a6232b /scheme
parenta13cc209e002a72a18c659d22ed39dbd99be2fcd (diff)
downloadproject_euler-726c5ce4decbcd354aff50d1a486bca8c2fa33c1.tar.gz
project_euler-726c5ce4decbcd354aff50d1a486bca8c2fa33c1.tar.bz2
project_euler-726c5ce4decbcd354aff50d1a486bca8c2fa33c1.zip
problem 1 2 in scheme
Diffstat (limited to 'scheme')
-rw-r--r--scheme/001-multiples_of_3_or_5.scm20
-rw-r--r--scheme/002-even_fibonacci_numbers.scm33
-rw-r--r--scheme/utils.scm22
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)))))