aboutsummaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-07 17:20:43 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-07 17:20:43 +0200
commit9af65c8ac721024d0e45a2a6bde5c3f9fe638516 (patch)
treee9af93ce9e4d0263b2e76d2fd29ada90d313f334 /lisp
parent31b43cf6d0d58812d30c0e2356f6458d06b1e52e (diff)
downloadproject_euler-9af65c8ac721024d0e45a2a6bde5c3f9fe638516.tar.gz
project_euler-9af65c8ac721024d0e45a2a6bde5c3f9fe638516.tar.bz2
project_euler-9af65c8ac721024d0e45a2a6bde5c3f9fe638516.zip
problem 1 2 4 in common lisp
Diffstat (limited to 'lisp')
-rw-r--r--lisp/"asdf0
-rw-r--r--lisp/001-multiples_of_3_and_5.lisp16
-rw-r--r--lisp/002-even_fibonacci_numbers.lisp24
-rw-r--r--lisp/003-largest_prime_factor.lisp31
-rw-r--r--lisp/004-largest_palindrome_product.lisp23
-rw-r--r--lisp/005-smallest_multiple.lisp8
6 files changed, 102 insertions, 0 deletions
diff --git a/lisp/"asdf b/lisp/"asdf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lisp/"asdf
diff --git a/lisp/001-multiples_of_3_and_5.lisp b/lisp/001-multiples_of_3_and_5.lisp
new file mode 100644
index 0000000..05b9173
--- /dev/null
+++ b/lisp/001-multiples_of_3_and_5.lisp
@@ -0,0 +1,16 @@
+;;;; ;;;;;;;;
+;;;; Multiples of 3 and 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.
+;;;; ;;;;;;;;
+
+(defvar *sum* 0)
+
+(dotimes (x 1000)
+ (when (or (eql 0 (mod x 5)) (eql 0 (mod x 3)))
+ (incf *sum* x)))
+
+(print *sum*)
+
diff --git a/lisp/002-even_fibonacci_numbers.lisp b/lisp/002-even_fibonacci_numbers.lisp
new file mode 100644
index 0000000..be9ed74
--- /dev/null
+++ b/lisp/002-even_fibonacci_numbers.lisp
@@ -0,0 +1,24 @@
+;;;; ;;;;;;;;
+;;;; 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.
+;;;; ;;;;;;;;
+
+(defun sum (xs)
+ (if (null xs)
+ 0
+ (+ (car xs) (sum (cdr xs)))))
+
+(defun fib (x y)
+ (when (> x 4000000) (return-from fib ()))
+ (cons x (fib y (+ x y))))
+
+(defvar *fibs-below-4m* (fib 1 2))
+
+(setf *fibs-below-4m* (remove-if-not #'evenp *fibs-below-4m*))
+(print (sum *fibs-below-4m*))
diff --git a/lisp/003-largest_prime_factor.lisp b/lisp/003-largest_prime_factor.lisp
new file mode 100644
index 0000000..e2fbe7a
--- /dev/null
+++ b/lisp/003-largest_prime_factor.lisp
@@ -0,0 +1,31 @@
+;;;; ;;;;;;;;
+;;;; Largest prime factor
+;;;; Problem 3
+;;;;
+;;;; The prime factors of 13195 are 5, 7, 13 and 29.
+;;;; What is the largest prime factor of the number 600851475143 ?
+;;;; ;;;;;;;;
+
+(defconstant +big-num+ 600851475143)
+
+(defun is-prime-rec (n d)
+(cond
+ ((= 0 (mod n d)) nil)
+ ((= 0 (mod n (+ d 2))) nil)
+ ((> (* d d) n) t)
+ (t (is-prime-rec n (+ d 6)))))
+
+(defun is-prime (n)
+ (when (or (= 0 (mod n 2)) (= 0 (mod n 3))) (return-from is-prime nil))
+ (is-prime-rec n 5))
+
+
+; (print (is-prime 1597))
+
+(defvar *largest* 0)
+
+(dotimes (x +big-num+)
+ (print x)
+ (when (and (= 0 (mod +big-num+ is-prime x) (setf *largest* x)))
+
+(print *largest*)
diff --git a/lisp/004-largest_palindrome_product.lisp b/lisp/004-largest_palindrome_product.lisp
new file mode 100644
index 0000000..8cbc7c9
--- /dev/null
+++ b/lisp/004-largest_palindrome_product.lisp
@@ -0,0 +1,23 @@
+;;;; ;;;;;;;;
+;;;; Largest palindrome product
+;;;; Problem 4
+;;;;
+;;;; A palindromic number reads the same both ways.
+;;;; The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
+;;;; Find the largest palindrome made from the product of two 3-digit numbers.
+;;;; ;;;;;;;;
+
+(defun palindrome-p (n)
+ (equal (write-to-string n) (reverse (write-to-string n))))
+
+(print (palindrome-p 32))
+
+(defvar *largest* 0)
+
+(loop :for x :from 999 :downto 1 :do
+ (loop :for y :from 999 :downto 1 :do
+ (when (and (palindrome-p (* x y)) (> (* x y) *largest*))
+ (print (* x y))
+ (setf *largest* (* x y)))))
+
+(print *largest*)
diff --git a/lisp/005-smallest_multiple.lisp b/lisp/005-smallest_multiple.lisp
new file mode 100644
index 0000000..9599507
--- /dev/null
+++ b/lisp/005-smallest_multiple.lisp
@@ -0,0 +1,8 @@
+;;;; ;;;;;;;;
+;;;; Smallest multiple
+;;;; Problem 5
+;;;;
+;;;; 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
+;;;; What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
+;;;; ;;;;;;;;
+