(defun reverse-integer (integer &key (radix 10))
(let ((sign (if (minusp integer) #'- #'+))
(i (abs integer)))
(loop for (q r) = (multiple-value-list (floor i radix))
then (multiple-value-list (floor q radix))
collect r into digits
until (zerop q)
finally (return (funcall sign
(reduce (lambda (a v) (+ (* a radix) v))
digits
:initial-value 0))))))
(defun palindromic-number-p (x &key (radix 10) include-negative-numbers)
(and (integerp x)
(or include-negative-numbers
(<= 0 x))
(or (<= 0 (abs x) 9)
(= x (reverse-integer x :radix radix)))))
(defun find-closest-palindromic-numbers (n &key (radix 10)
include-negative-numbers)
(loop for u upfrom n
for d downfrom n
for r = (remove nil
(list (if (palindromic-number-p u
:radix radix
:include-negative-numbers
include-negative-numbers)
u)
(if (palindromic-number-p d
:radix radix
:include-negative-numbers
include-negative-numbers)
d)))
when (car r)
do (return (delete-duplicates (sort r #'<)))))
(loop for s = (read-line nil nil)
for n = (and s (parse-integer s))
while s
do (format t "~{~D~^, ~}~%"
(find-closest-palindromic-numbers n)))