def palindromic_numbers_v1
Enumerator.new do |y|
y << 0
(1..Float::INFINITY).lazy.map {|k| [10 ** (k - 1), 10 ** k - 1].map(&:to_s)}.each do |b, e|
(b..e).each {|s| y << (s + s.reverse[1..-1]).to_i}
(b..e).each {|s| y << (s + s.reverse).to_i}
end
end
end
def palindromic_numbers
arevb = -> a, b {b == 0 ? a : arevb.(a * 10 + b % 10, b / 10)}
Enumerator.new do |y|
y << 0
(1..Float::INFINITY).lazy.map {|k| [10 ** (k - 1), 10 ** k - 1]}.each do |b, e|
(b..e).each {|x| y << arevb.(x, x / 10)}
(b..e).each {|x| y << arevb.(x, x)}
end
end
end
f = -> n {
ps = palindromic_numbers.each_cons(2).find {|a, b| a <= n && n <= b}
ps.map {|x| [(n - x).abs, x]}.sort.uniq.group_by(&:first).first.last.map(&:last)
}
p [0, 17, 100, 1000, 10000].map {|n| [n, f.(n)]}
require 'benchmark'
Benchmark.benchmark(Benchmark::CAPTION, 12) do |x|
n = 500000
x.report("v1(#{n}): ") {palindromic_numbers_v1.take(n)}
x.report("v2(#{n}): ") {palindromic_numbers.take(n)}
x.report("v1(#{n}): ") {palindromic_numbers_v1.take(n)}
x.report("v2(#{n}): ") {palindromic_numbers.take(n)}
p palindromic_numbers_v1.take(n) == palindromic_numbers.take(n)
end
#p palindromic_numbers_v1.lazy.zip(palindromic_numbers.lazy).map {|v1, v2| [v1 - v2, v1, v2]}.take(50).force.sort
ZGVmIHBhbGluZHJvbWljX251bWJlcnNfdjEKICBFbnVtZXJhdG9yLm5ldyBkbyB8eXwKICAgIHkgPDwgMAogICAgKDEuLkZsb2F0OjpJTkZJTklUWSkubGF6eS5tYXAge3xrfCBbMTAgKiogKGsgLSAxKSwgMTAgKiogayAtIDFdLm1hcCgmOnRvX3MpfS5lYWNoIGRvIHxiLCBlfAogICAgICAoYi4uZSkuZWFjaCB7fHN8IHkgPDwgKHMgKyBzLnJldmVyc2VbMS4uLTFdKS50b19pfQogICAgICAoYi4uZSkuZWFjaCB7fHN8IHkgPDwgKHMgKyBzLnJldmVyc2UpLnRvX2l9CiAgICBlbmQKICBlbmQKZW5kCmRlZiBwYWxpbmRyb21pY19udW1iZXJzCiAgYXJldmIgPSAtPiBhLCBiIHtiID09IDAgPyBhIDogYXJldmIuKGEgKiAxMCArIGIgJSAxMCwgYiAvIDEwKX0KICBFbnVtZXJhdG9yLm5ldyBkbyB8eXwKICAgIHkgPDwgMAogICAgKDEuLkZsb2F0OjpJTkZJTklUWSkubGF6eS5tYXAge3xrfCBbMTAgKiogKGsgLSAxKSwgMTAgKiogayAtIDFdfS5lYWNoIGRvIHxiLCBlfAogICAgICAoYi4uZSkuZWFjaCB7fHh8IHkgPDwgYXJldmIuKHgsIHggLyAxMCl9CiAgICAgIChiLi5lKS5lYWNoIHt8eHwgeSA8PCBhcmV2Yi4oeCwgeCl9CiAgICBlbmQKICBlbmQKZW5kCmYgPSAtPiBuIHsKICBwcyA9IHBhbGluZHJvbWljX251bWJlcnMuZWFjaF9jb25zKDIpLmZpbmQge3xhLCBifCBhIDw9IG4gJiYgbiA8PSBifQogIHBzLm1hcCB7fHh8IFsobiAtIHgpLmFicywgeF19LnNvcnQudW5pcS5ncm91cF9ieSgmOmZpcnN0KS5maXJzdC5sYXN0Lm1hcCgmOmxhc3QpCn0KcCBbMCwgMTcsIDEwMCwgMTAwMCwgMTAwMDBdLm1hcCB7fG58IFtuLCBmLihuKV19CgpyZXF1aXJlICdiZW5jaG1hcmsnCkJlbmNobWFyay5iZW5jaG1hcmsoQmVuY2htYXJrOjpDQVBUSU9OLCAxMikgZG8gfHh8CiAgbiA9IDUwMDAwMAogIHgucmVwb3J0KCJ2MSgje259KTogIikge3BhbGluZHJvbWljX251bWJlcnNfdjEudGFrZShuKX0KICB4LnJlcG9ydCgidjIoI3tufSk6ICIpIHtwYWxpbmRyb21pY19udW1iZXJzLnRha2Uobil9CiAgeC5yZXBvcnQoInYxKCN7bn0pOiAiKSB7cGFsaW5kcm9taWNfbnVtYmVyc192MS50YWtlKG4pfQogIHgucmVwb3J0KCJ2Migje259KTogIikge3BhbGluZHJvbWljX251bWJlcnMudGFrZShuKX0KICBwIHBhbGluZHJvbWljX251bWJlcnNfdjEudGFrZShuKSA9PSBwYWxpbmRyb21pY19udW1iZXJzLnRha2UobikKZW5kCiNwIHBhbGluZHJvbWljX251bWJlcnNfdjEubGF6eS56aXAocGFsaW5kcm9taWNfbnVtYmVycy5sYXp5KS5tYXAge3x2MSwgdjJ8IFt2MSAtIHYyLCB2MSwgdjJdfS50YWtlKDUwKS5mb3JjZS5zb3J0Cg==
[[0, [0]], [17, [22]], [100, [99, 101]], [1000, [999, 1001]], [10000, [9999, 10001]]]
user system total real
v1(500000): 0.531450 0.000000 0.531450 ( 0.534889)
v2(500000): 0.517562 0.000000 0.517562 ( 0.520639)
v1(500000): 0.508999 0.000000 0.508999 ( 0.512154)
v2(500000): 0.508406 0.000000 0.508406 ( 0.511309)
true