(defun solve (stream) (let ((wanted (make-array 2021 :element-type 'bit :initial-element 0))) (loop for x = (parse-integer (read-line stream)) for y = (- 2020 x) if (zerop (elt wanted x)) do (setf (elt wanted y) 1) else return (* x y)))) (defun solve2 (stream) (let ((wanted (make-hash-table :test 'eql :size 1010)) (prior nil)) (loop for x = (parse-integer (read-line stream)) for product = (gethash x wanted) for max-y = (- 2020 x) when product return (* product x) do (loop for y in prior while (<= y max-y) do (setf (gethash (- max-y y) wanted) (* x y))) (setf prior (merge 'list prior (list x) #'<)))))