On Mon, Jan 16, 2012 at 10:05 PM, Abinoam Jr. <abinoam / gmail.com> wrote: > On Mon, Jan 16, 2012 at 9:22 PM, Abinoam Jr. <abinoam / gmail.com> wrote: >> On Mon, Jan 16, 2012 at 1:48 PM, Magnus Holm <judofyr / gmail.com> wrote: >>> On Mon, Jan 16, 2012 at 17:04, Adam Prescott <adam / aprescott.com> wrote: >>>> On Mon, Jan 16, 2012 at 16:00, Sigurd <cu9ypd / gmail.com> wrote: >>>> >>>>> [4,5,6,4,5,6,6,7].inject(Hash.new(0)) {|res, x| res[x] += 1; res } >>>>> >>>> >>>> I think this is a misuse of inject, personally, every time I see it. It's >>>> harder to read and it doesn't give the feeling of actually "reducing" >>>> (inject's alias) the array down to one thing. The required `; res` is a >>>> sign of that. Compare: >>>> >>>> [1, 2, 3, 4].inject(5) { |a, b| a + b } >>> >>> There's always each_with_object, although it's a little long: >>> >>> ¨Â´¬µ¬¶¬´¬µ¬¶¬¶¬·Ý®åáãèß÷éôèßïâêåãô¨Èáóè®îå÷¨°©© üøòåóü òåóÛøÝ «½ >>> >> >> I think Magnus Holm is the clearest (IMHO, yes, it's just a taste and >> humble opinion.). >> >> [4,5,6,4,5,6,6,7].each_with_object(Hash.new(0)) {|num, hsh| hsh[num] += 1} >> >> Another way (not better) I remember is... >> >> Hash[ [4,5,6,4,5,6,6,7].sort.chunk {|n| n}.map {|ix, els| [ix, els.size]> >> See: http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-chunk >> >> It also can be... clearer?!? >> >> Hash[ [4,5,6,4,5,6,6,7].group_by {|n| n}.map {|ix, els| [ix, els.size] }> >> Perhaps something like this (same as Magnus Holm) just hiding the >> complexity into the method. >> >> class Array >> ¨Âåæ ôïôáìéúåßôïßèáóè >> ¨Âóè Èáóè®îå÷¨°>> ¨Âåìæ®åáãè äï üî>> ¨ÂóèÛ >> ¨Âîä >> ¨Âóè >> ¨Âîä >> end >> >> [4,5,6,4,5,6,6,7].totalize_to_hash >> >> Abinoam Jr. > > Some benchmark results... > > n = 100_000 > Benchmark.bm(15) do |b| > ¨Â®òåðïòô¨¢Òáìðè Óèîåéöåòº¢î®ôéíåÛ´¬µ¬¶¬´¬µ¬¶¬¶¬·Ý» > result = Hash.new(0); a.each { |x| ¨ÂåóõìôÛøÝ «½ ý» òåóõìô> ¨Â®òåðïòô¨¢Óéçõò亢© ¨Â î®ôéíå> [4,5,6,4,5,6,6,7].inject(Hash.new(0)) {|res, x| res[x] += 1; res } } } > ¨Â®òåðïòô¨¢Ëåéîéãè £±¢© î®ôéíåÈáóèÛá®çòïõðßâùûüîüîý®íáðûüë> v|[k, v.size]}] } } > ¨Â®òåðïòô¨¢Ëåéîéãè £²¢© î®ôéíå> Hash.new(0).tap{|h|a.each{|n|h[n] += 1}} } } > ¨Â®òåðïòô¨¢ÍáçîõÈïìíº¢î®ôéíå> [4,5,6,4,5,6,6,7].each_with_object(Hash.new(0)) { |x, res| res[x] += 1 > } } } > ¨Â®òåðïòô¨¢Áâéîïáí £±º¢ ¨Â î®ôéíåÈáóè> [4,5,6,4,5,6,6,7].sort.chunk {|n| n}.map {|ix, els| [ix, els.size] } ] > } } > end > > user system ¨Âïôáì ¨Âåá> Ralph Shneiver: 0.290000 0.000000 0.290000 ( .259640) > Sigurd: .320000 0.000000 0.320000 ( .289873) > Keinich #1 0.560000 0.000000 0.560000 ( .497736) > Keinich #2 0.280000 0.000000 0.280000 ( .250843) > Magnus Holm: 0.310000 0.000000 0.310000 ( .283344) > Abinoam #1: .140000 0.000000 1.140000 ( .042744) > > Abinoam Jr. > Sorry for the mess... (some error in the bench code + horrible text wrapping) Apologizing with the gist... https://gist.github.com/1624016 Abinoam Jr.