@m_seki の

I like ruby tooから引っ越し

先日のtoRubyの課題

正の整数の数値の範囲を、正規表現でマッチさせたい! というのがありました。
私の回答を載せます。ゴルファーはもっとうまいコードを書くんだろうなあ。

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