From 9af65c8ac721024d0e45a2a6bde5c3f9fe638516 Mon Sep 17 00:00:00 2001 From: Charles Date: Tue, 7 Apr 2020 17:20:43 +0200 Subject: problem 1 2 4 in common lisp --- "lisp/\"asdf" | 0 lisp/001-multiples_of_3_and_5.lisp | 16 ++++++++++++++++ lisp/002-even_fibonacci_numbers.lisp | 24 ++++++++++++++++++++++++ lisp/003-largest_prime_factor.lisp | 31 +++++++++++++++++++++++++++++++ lisp/004-largest_palindrome_product.lisp | 23 +++++++++++++++++++++++ lisp/005-smallest_multiple.lisp | 8 ++++++++ 6 files changed, 102 insertions(+) create mode 100644 "lisp/\"asdf" create mode 100644 lisp/001-multiples_of_3_and_5.lisp create mode 100644 lisp/002-even_fibonacci_numbers.lisp create mode 100644 lisp/003-largest_prime_factor.lisp create mode 100644 lisp/004-largest_palindrome_product.lisp create mode 100644 lisp/005-smallest_multiple.lisp (limited to 'lisp') diff --git "a/lisp/\"asdf" "b/lisp/\"asdf" new file mode 100644 index 0000000..e69de29 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? +;;;; ;;;;;;;; + -- cgit