20 lines
626 B
Common Lisp
20 lines
626 B
Common Lisp
(defun next-hamm (factors seqs)
|
|
(let ((x (apply #'min (map 'list #'first seqs))))
|
|
(loop for s in seqs
|
|
for f in factors
|
|
for i from 0
|
|
with add = t do
|
|
(if (= x (first s)) (pop s))
|
|
;; prevent a value from being added to multiple lists
|
|
(when add
|
|
(setf (elt seqs i) (nconc s (list (* x f))))
|
|
(if (zerop (mod x f)) (setf add nil)))
|
|
finally (return x))))
|
|
|
|
(loop with factors = '(2 3 5)
|
|
with seqs = (loop for i in factors collect '(1))
|
|
for n from 1 to 1000001 do
|
|
(let ((x (next-hamm factors seqs)))
|
|
(if (or (< n 21)
|
|
(= n 1691)
|
|
(= n 1000000)) (format t "~d: ~d~%" n x))))
|