(defun digits (n &optional (b 10))
(loop for i = n then (floor i b) with lst = ()
do (push (mod i b) lst)
while (> i (1- b))
finally (return lst)))
(defun onep (n) (equal 1 n))
(defun count-ones (n)
(reduce #'+ (remove-if-not #'onep (digits n))))
(defun count-ones-find (fun)
(loop for i = 1 then (1+ i) with sum = 0
do (progn
(setf sum (+ sum (funcall fun i))))
until (and (> i 1) (equal i sum))
finally (return i)))
; CL-USER> (time (count-ones-find #'count-ones))
; Evaluation took:
; 0.081 seconds of real time
; 0.084005 seconds of total run time (0.084005 user, 0.000000 system)
; 103.70% CPU
; 248,871,367 processor cycles
; 23,818,080 bytes consed
;
; 199981