fork download
  1. (defun reverse-integer (integer &key (radix 10))
  2. (let ((sign (if (minusp integer) #'- #'+))
  3. (i (abs integer)))
  4. (loop for (q r) = (multiple-value-list (floor i radix))
  5. then (multiple-value-list (floor q radix))
  6. collect r into digits
  7. until (zerop q)
  8. finally (return (funcall sign
  9. (reduce (lambda (a v) (+ (* a radix) v))
  10. digits
  11. :initial-value 0))))))
  12.  
  13. (defun palindromic-number-p (x &key (radix 10) include-negative-numbers)
  14. (and (integerp x)
  15. (or include-negative-numbers
  16. (<= 0 x))
  17. (or (<= 0 (abs x) 9)
  18. (= x (reverse-integer x :radix radix)))))
  19.  
  20. (defun find-closest-palindromic-numbers (n &key (radix 10)
  21. include-negative-numbers)
  22. (loop for u upfrom n
  23. for d downfrom n
  24. for r = (remove nil
  25. (list (if (palindromic-number-p u
  26. :radix radix
  27. :include-negative-numbers
  28. include-negative-numbers)
  29. u)
  30. (if (palindromic-number-p d
  31. :radix radix
  32. :include-negative-numbers
  33. include-negative-numbers)
  34. d)))
  35. when (car r)
  36. do (return (delete-duplicates (sort r #'<)))))
  37.  
  38.  
  39. (loop for s = (read-line nil nil)
  40. for n = (and s (parse-integer s))
  41. while s
  42. do (format t "~{~D~^, ~}~%"
  43. (find-closest-palindromic-numbers n)))
  44.  
Success #stdin #stdout 0.01s 29268KB
stdin
0
17
100
stdout
0
22
99, 101