diff --git a/1/sum-integers.lisp b/1/sum-integers.lisp new file mode 100644 index 0000000..0294e83 --- /dev/null +++ b/1/sum-integers.lisp @@ -0,0 +1,23 @@ +(in-package :nisp.euler) + +(defun sum-integers-if (predicate start end &optional (step 1)) + "Sum numbers satisfying PREDICATE from START to END." + (iterate (for n :from start :to end :by step) + (when (funcall predicate n) + (sum n :into result)) + (declare (fixnum result)) ; Help the compiler optimize. + (finally (return result)))) + +(defun solution-1/1 () + "Call `sum-integers-if' after we compose predicate. + +This is a purely functional way of solving this problem." + (sum-integers-if (disjoin (compose (curry #'= 0) (rcurry #'mod 3)) + (compose (curry #'= 0) (rcurry #'mod 5))) + 0 999)) + +(defun solution-1/2 () + "Use a local function definition for the predicate." + (flet ((validp (n) + (or (= 0 (mod n 3)) (= 0 (mod n 5))))) + (sum-integers-if #'validp 0 999))) diff --git a/nisp.euler.asd b/nisp.euler.asd new file mode 100644 index 0000000..3428c95 --- /dev/null +++ b/nisp.euler.asd @@ -0,0 +1,7 @@ +(asdf:defsystem :nisp.euler + :serial t + :components + ((:file "package") + (:module "1" + :components + ((:file "sum-integers"))))) \ No newline at end of file diff --git a/package.lisp b/package.lisp new file mode 100644 index 0000000..4297459 --- /dev/null +++ b/package.lisp @@ -0,0 +1,3 @@ +(defpackage #:nisp.euler + (:use :cl :iterate :alexandria) + (:nicknames :euler)) \ No newline at end of file