f = -> n {
p = -> s {s.size.divmod(2).tap {|q, r| break (s[0, q + r] + s[0, q].reverse).to_i}}
s = n.to_s
t, u = s.size.divmod(2).tap {|q, r| break s[0, q + r], s[q + r..-1]}
ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u)]
ps.map {|x| [(n - x).abs, x]}.sort.uniq.group_by(&:first).first.last.map(&:last)
}
p [0, 17, 100, 1000, 10000, 18446744073709551615_18446744073709551615].map {|n| [n, f.(n)]}
ZiA9IC0+IG4gewogIHAgPSAtPiBzIHtzLnNpemUuZGl2bW9kKDIpLnRhcCB7fHEsIHJ8IGJyZWFrIChzWzAsIHEgKyByXSArIHNbMCwgcV0ucmV2ZXJzZSkudG9faX19CiAgcyA9IG4udG9fcwogIHQsIHUgPSBzLnNpemUuZGl2bW9kKDIpLnRhcCB7fHEsIHJ8IGJyZWFrIHNbMCwgcSArIHJdLCBzW3EgKyByLi4tMV19CiAgcHMgPSBbcC4ocyksIHAuKHQudG9faS5wcmVkLmFicy50b19zICsgdSksIHAuKHQuc3VjYyArIHUpXQogIHBzLm1hcCB7fHh8IFsobiAtIHgpLmFicywgeF19LnNvcnQudW5pcS5ncm91cF9ieSgmOmZpcnN0KS5maXJzdC5sYXN0Lm1hcCgmOmxhc3QpCn0KcCBbMCwgMTcsIDEwMCwgMTAwMCwgMTAwMDAsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1XzE4NDQ2NzQ0MDczNzA5NTUxNjE1XS5tYXAge3xufCBbbiwgZi4obildfQ==
[[0, [0]], [17, [22]], [100, [99, 101]], [1000, [1001]], [10000, [9999, 10001]], [1844674407370955161518446744073709551615, [1844674407370955161551615590737044764481]]]