On Mar 30, 12:27 am, 7stud -- <bbxx789_0... / yahoo.com> wrote:
> Oh, yeah:
>
> $ ruby -v
> ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
>
> By the way, using inject() is inefficient--not to mention confusing.
> You might as well pretend it doesn't exist.

There is some truth to that.


def collect_repeats_inject list
  return [] if [] == list
  list[1..-1].inject([[ list.first ]]){|a,e|
    if a[-1][0] == e
      a[-1] << e
    else
      a << [e]
    end
    a
  }.reject{|lst|  lst.size < 2 }
end

def collect_repeats list
  accum = [ [ list.shift ] ]
  list.each{|e|
    if accum[-1][0] == e
      accum[-1] << e
    else
      accum << [e]
    end }
  accum.reject{|lst|  lst.size < 2 }
end

p collect_repeats( %w(0 1 1 2 3 3 3 3 4 5 5 6) )
p collect_repeats( [] )
p collect_repeats_inject( %w(0 1 1 2 3 3 3 3 4 5 5 6) )
p collect_repeats_inject( [] )

the_list =  %w(0 1 1 2 3 3 3 3 3 3 3 3 4 5 5 6 7 8 8 9 9 9)

t = Time.now
9999.times{ collect_repeats_inject( the_list )}
p Time.now - t
t = Time.now
9999.times{ collect_repeats( the_list )}
p Time.now - t

--- output ---
[["1", "1"], ["3", "3", "3", "3"], ["5", "5"]]
[]
[["1", "1"], ["3", "3", "3", "3"], ["5", "5"]]
[]
2.694
0.16


And the version without inject is shorter and
clearer.