正の整数の数値の範囲を、正規表現でマッチさせたい! というのがありました。
私の回答を載せます。ゴルファーはもっとうまいコードを書くんだろうなあ。
def put_range(m, n) case n - m when 9 '\d' when 1 "[#{m}#{n}]" when 0 m.to_s else "[#{m}-#{n}]" end end def put_or(l, r) "(#{l}|#{r})" end def range(m, n) raise [m, n].inspect unless m <= n && 0 <= m md, mm = m.divmod(10) nd, nm = n.divmod(10) if md == nd if md == 0 put_range(mm, nm) else range(md, md) + range(mm, nm) end else if mm != 0 put_or(range(m, md * 10 + 9), range((md + 1) * 10, n)) elsif nm != 9 put_or(range(m, nd * 10 - 1), range(nd * 10, n)) else range(md, nd) + range(0, 9) end end end reg = Regexp.new("^#{range(11, 328)}$") p reg here = nil 1001.times do |n| if reg =~ n.to_s if here != true p [:in, n] here = true end else if here != false p [:out, n] here = false end end end