From: Robert Klemme Date: 2010-11-03T21:31:20+09:00 Subject: Re: Regular Expression 2010/11/3 Jesús Gabriel y Galán : > On Wed, Nov 3, 2010 at 11:10 AM, Robert Klemme > wrote: >> Interesting approach.  I would simply have done >> >> def check(input) >>  raise ArgumentError, "Illegal chars in sequence: %p" % input unless >> /\A[A-D]{0,4}\z/ =~ input >>  cnt = Hash.new 0 >>  input.scan /./ do |m| >>    raise ArgumentError, "Illegal sequence %p" % input if (cnt[m] += 1) > 1 >>    # alt: return false >>  end >>  # alt: true >> end > > There are different requirements for each letter. Adapting your solution: Good point! I overlooked that. > def check(input) >  limits = {'A' => 1, 'B' => 1, 'C' => 1, 'D' => 2} >  raise ArgumentError, "Illegal chars in sequence: %p" % input unless > /\A[A-D]{0,4}\z/ =~ input >  cnt = Hash.new 0 >  input.scan /./ do |m| >    cnt[m] += 1 >  end > >  cnt.each do |letter, amount| >    raise ArgumentError, "Illegal chars in sequence: %p" % input if > amount > limits[letter] >  end > end I'd rather do: def check(input) raise ArgumentError, "Illegal chars in sequence: %p" % input unless /\A[A-D]{0,4}\z/ =~ input cnt = {'A' => 1, 'B' => 1, 'C' => 1, 'D' => 2} input.scan /./ do |m| raise ArgumentError, "Illegal sequence %p" % input if (cnt[m] -= 1) < 0 # alt: return false end # alt: true end :-) Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/