On 30.04.2007 12:39, Robert Dober wrote:
> On 4/30/07, Robert Klemme <shortcutter / googlemail.com> wrote:
>> On 29.04.2007 16:11, Chris Carter wrote:
>> > On 4/29/07, Billy Hsu <ruby.maillist / gmail.com> wrote:
>> >> Hi, I'm CFC
>> >> I'm new at here.
>> >> Nice to meet you:)
>> >>
>> >  > I just coded an extension for Array.
>> >> It will return the longest element of an array.
>> >> Source:
>> >>
>> >> class Array
>> >>   def which_long?
>> >>     # Version 1.0
>> >>     # Coded by CFC < zusocfc @ gmail . com >
>> >>     # PLEASE DO NOT REMOVE THE COMMENT OF THIS FUNCTION, THANKS A LOT.
>> >>     # Usage:
>> >>     #   ['a', 'ab', 'abc' 1234].which_long?
>> >>     #   => 1234
>> >>     max, long, self_cpy = 0, "", []
>> >>     self.size.times{|i| self_cpy << self[i].to_s}
>> >>     self_cpy.each{|item| (max = item.size; long = item) if item.size >
>> >> max }
>> >>     long
>> >>   end
>> >> end
>> >>
>> >> Usage:
>> >>   puts [1, 23, '456'].which_long?
>> >>   => 456
>> >>
>> >> CFC --
>> >>
>> > How about:
>> > class Array
>> >  def longest
>> >    self.map {|x| x.to_s }.sort_by {|x| x.size}[-1]
>> >  end
>> > end
>>
>> Thank you for leaving the #inject solutions to me. :-)
> Are you kidding I posted an inject solution 19h ago ;)

I am sorry, I did not see it.

> But it was to return an array of all longest elements, I guess you can
> maybe refine it, it seems clumsy, so I repost it just if you have some
> time to play ;)
> 
> def longest
>          inject([]){ |s, e|
>                 if s.empty? || s.first.size < e.to_s.size then [e]
>                 elsif s.first.size == e.to_s.size then s << e
>                 else s
>                 end
>               }
> end

Hm, I'd probably use case here.  Let's see...

def longest
   inject([]) do |lg, e|
     case
       when lg.empty?, lg.first.size == e.size
         lg << e
       when lg.first.size < e.size
         [e]
       else
         lg
     end
   end
end

Alternative, but with higher memory consumption

def longest
   lg = Hash.new {|h,k| h[k] = []}
   each {|x| lg[x.size] << x}
   lg.sort_by {|k,v| k}.last.pop
end

>> irb(main):001:0> %w{a ab abc 123 34}.inject{|a,b| a.size > b.size ? a 
>> : b}
>> => "123"
>> irb(main):002:0> %w{a ab abc 123 34}.inject{|a,b| a.size >= b.size ? a 
>> : b}
> 
> You get full credits for this anyway it is really beautiful, can you
> stop being so clever ;).

Since I overlooked your posting I can't be so clever, can I? :-)

With #inject it's really special, it took me a while to pick it up and 
now I can't stop using it.  IIRC I even went to the exercise to 
implement all methods in Enumerable by using #inject - maybe you can 
find it in the archives. :-)

Kind regards

	robert