From 1d2e635f05d74807cddbbf90f43f982c5f7784a7 Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Wed, 19 Oct 2016 14:34:59 -0700 Subject: [PATCH] solution to problem 003 in lisp --- lisp/euler.lisp | 12 +++++++++++- lisp/euler003.lisp | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 lisp/euler003.lisp diff --git a/lisp/euler.lisp b/lisp/euler.lisp index 9f9679f..6d582b6 100644 --- a/lisp/euler.lisp +++ b/lisp/euler.lisp @@ -1,3 +1,13 @@ -(defun range (min max) (loop for n from min below max by 1 collect n)) +(defun range (min max) (loop for n from min below (+ max 1) by 1 collect n)) (defun sum (list) (apply '+ list)) (defun select (expr list) (remove-if-not expr list)) +(defun filter (expr list) (remove-if expr list)) + +(defun partial (func &rest args1) + (lambda (&rest args2) + (apply func (append args1 args2))) +) + +(defun prime (n) + (eq (length (member T (mapcar (lambda (a) (eq (mod n a) 0)) (range 2 (sqrt n))))) 0) +) diff --git a/lisp/euler003.lisp b/lisp/euler003.lisp new file mode 100644 index 0000000..7292da8 --- /dev/null +++ b/lisp/euler003.lisp @@ -0,0 +1,15 @@ +(load "euler.lisp") + +(defun eratosthenes-helper (expr list-one list-two) + (if (> (length list-one) 0) (eratosthenes-helper expr (filter (partial expr (first list-one)) (rest list-one)) (filter (partial expr (first list-one)) list-two)) list-two) +) + +(defun eratosthenes (n) + (eratosthenes-helper (lambda (x a) (and (eq (mod a x) 0) (/= a x))) (range 2 (sqrt n)) (range 2 n)) +) + +(defun prime-factors (n) + (select (lambda (a) (eq (mod n a) 0)) (eratosthenes (sqrt n))) +) + +(defun solution () (first (reverse (prime-factors 600851475143))))