aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--languages.json16
-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
5 files changed, 94 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index ccef705..3e65eee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,7 @@ haskell/wip/*
rust/*
!rust/*.rs
+scheme/*
+!scheme/*.scm
+
tags
diff --git a/languages.json b/languages.json
index 8e4224b..4e6e40a 100644
--- a/languages.json
+++ b/languages.json
@@ -46,5 +46,21 @@
"prefix" : "# ",
"bottom": "###"
}
+ },
+ "clojure": {
+ "extension": "clj",
+ "comment" : {
+ "top": ";;;;",
+ "prefix" : ";; ",
+ "bottom": ";;;;"
+ }
+ },
+ "scheme": {
+ "extension": "scm",
+ "comment" : {
+ "top": ";;;;",
+ "prefix" : ";; ",
+ "bottom": ";;;;"
+ }
}
}
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)))))