
(defmacro abundant-numbers (limit) `(filter (macro-to-function is-abundant) (gen-list 1 ,limit))) (defmacro none (predicate lst) `(not (some ,predicate ,lst))) (defmacro take-while (predicate lst) `(labels ((take-while-iter (a-lst acc) (if (null a-lst) (nreverse acc) (let ((head (car a-lst)) (tail (cdr a-lst))) (if (funcall ,predicate head) (take-while-iter tail (cons head acc)) (nreverse acc)))))) (take-while-iter ,lst '()))) (defmacro drop-while (predicate lst) `(labels ((drop-while-iter (a-lst) (if (null a-lst) a-lst (let ((head (car a-lst)) (tail (cdr a-lst))) (if (funcall ,predicate head) (drop-while-iter tail) a-lst))))) (drop-while-iter ,lst))) (defun create-hash-from-list (lst) (let ((hash (make-hash-table :test 'equal))) (dolist (item lst) (setf (gethash item hash) t)) hash)) (defun is-not-abundant-sum (n abundant-list) (let* ((half-n-floor (floor (/ n 2))) (first-half (take-while #'(lambda (x) (<= x half-n-floor)) abundant-list)) (second-half (drop-while #'(lambda (x) (< x half-n-floor)) abundant-list)) (second-half-to-n (take-while #'(lambda (x) (< x n)) second-half)) (second-half-hash (create-hash-from-list second-half-to-n))) (none (lambda (a) (let ((b (- n a))) (gethash b second-half-hash))) first-half))) (defun not-abundant-sums-list (limit) (let ((abundant-list (abundant-numbers limit))) (filter #'(lambda (n) (is-not-abundant-sum n abundant-list)) (gen-list 1 limit))))
CL-USER> (time (sum (not-abundant-sums-list 28123))) Evaluation took: 2.481 seconds of real time 2.477531 seconds of total run time (2.389778 user, 0.087753 system) [ Run times consist of 0.152 seconds GC time, and 2.326 seconds non-GC time. ] 99.88% CPU 6,194,100,940 processor cycles 7,411,226,352 bytes consed 4179871
— Me@2024-10-04 03:38:12 PM
.
.
2024.10.05 Saturday (c) All rights reserved by ACHK

You must be logged in to post a comment.