(defparameter *memoization* (make-hash-table))
(defun digits (n &optional (l (list)))
(if (= n 0)
l
(multiple-value-bind (a b) (floor n 10)
(digits a (cons b l)))))
(defun square-digits (n &aux (hash (gethash n *memoization*)))
(if hash
hash
(loop for i in (digits n) summing (expt i 2))))
(defun process (n)
(loop
for c = (square-digits n)
until (or (= c 1) (= c 89))
collect c into results
do (setf n c)
finally
(loop for i in results do (setf (gethash i *memoization*) c))
(return c)))
(loop
with result = 0
for i from 1 to 10000000
do
(if (= (process i) 89) (incf result))
finally (print result))
;(loop for i being the hash-keys in *memoization* using (hash-value j)
; do (format t "~a ~a ~%" i j))
KGRlZnBhcmFtZXRlciAqbWVtb2l6YXRpb24qIChtYWtlLWhhc2gtdGFibGUpKQoKKGRlZnVuIGRpZ2l0cyAobiAmb3B0aW9uYWwgKGwgKGxpc3QpKSkKIChpZiAoPSBuIDApCiAgbAogIChtdWx0aXBsZS12YWx1ZS1iaW5kIChhIGIpIChmbG9vciBuIDEwKQogICAoZGlnaXRzIGEgKGNvbnMgYiBsKSkpKSkKCihkZWZ1biBzcXVhcmUtZGlnaXRzIChuICZhdXggKGhhc2ggKGdldGhhc2ggbiAqbWVtb2l6YXRpb24qKSkpCiAoaWYgaGFzaAogIGhhc2gKICAobG9vcCBmb3IgaSBpbiAoZGlnaXRzIG4pIHN1bW1pbmcgKGV4cHQgaSAyKSkpKQoKKGRlZnVuIHByb2Nlc3MgKG4pCiAobG9vcAogIGZvciBjID0gKHNxdWFyZS1kaWdpdHMgbikKICB1bnRpbCAob3IgKD0gYyAxKSAoPSBjIDg5KSkKICBjb2xsZWN0IGMgaW50byByZXN1bHRzCiAgZG8gKHNldGYgbiBjKQogIGZpbmFsbHkKICAgKGxvb3AgZm9yIGkgaW4gcmVzdWx0cyBkbyAoc2V0ZiAoZ2V0aGFzaCBpICptZW1vaXphdGlvbiopIGMpKQogICAocmV0dXJuIGMpKSkKCihsb29wCiB3aXRoIHJlc3VsdCA9IDAKIGZvciBpIGZyb20gMSB0byAxMDAwMDAwMAogZG8KICAoaWYgKD0gKHByb2Nlc3MgaSkgODkpIChpbmNmIHJlc3VsdCkpCiBmaW5hbGx5IChwcmludCByZXN1bHQpKQoKOyhsb29wIGZvciBpIGJlaW5nIHRoZSBoYXNoLWtleXMgaW4gKm1lbW9pemF0aW9uKiB1c2luZyAoaGFzaC12YWx1ZSBqKQo7IGRvIChmb3JtYXQgdCAifmEgfmEgfiUiIGkgaikpCgo=