# Il problema di Matteo all'RSC

**URL:** <https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502>\
**Category:** IT\
**Created:** [September 25, 2008, 2:13pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502 "2008-09-25T14:13:58Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:13pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/1 "2008-09-25T14:13:58Z")

</div>

Ciao oggi da perfetto fancazzista ancora semiubriaco (3 bloody mary, 2  
vodka tonic, 1 ginger&whiskey, 1 russian, 2 panini a caso) ho provato  
a risolvere il problema proposto ieri da Matteo:

“Ho un array di tre categorie di elementi, come lo partiziono in un  
solo passaggio?”

La mia soluzione (comprensiva di due test, giusto per essere  
ridondante) è qui: [http://pastie.org/279258](http://pastie.org/279258)

Qualcuno ha una soluzione più bella?

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:15pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/2 "2008-09-25T14:15:45Z")

</div>

%w(m m f g f m f g m m g f).sort  
#=\> [“f”, “f”, “f”, “f”, “g”, “g”, “g”, “m”, “m”, “m”, “m”, “m”]

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:19pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/3 "2008-09-25T14:19:19Z")

</div>

In un passaggio.

Il giorno 25/set/08, alle ore 14:15, Luca G. ha scritto:

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:19pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/4 "2008-09-25T14:19:54Z")

</div>

E inoltre, se sono elementi diversi, tipo numeri che finiscono per 9,  
numeri che finiscono per 3 e stringhe, sort non va bene.  
Il giorno 25/set/08, alle ore 14:15, Luca G. ha scritto:

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:24pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/5 "2008-09-25T14:24:00Z")

</div>

Giovanni I. wrote:

> E inoltre, se sono elementi diversi, tipo numeri che finiscono per 9,  
> numeri che finiscono per 3 e stringhe, sort non va bene.  
> Già stai a cambiare le specifiche? 😛  
> PS: Esiste anche #sort\_by 😉

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:25pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/6 "2008-09-25T14:25:10Z")

</div>

Le specifiche parlavano di elementi, io ho solo fatto un test con  
caratteri 🙂

E anche sort\_by non lo fa in un solo passaggio.

Il giorno 25/set/08, alle ore 14:23, Luca G. ha scritto:

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 2:53pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/7 "2008-09-25T14:53:23Z")

</div>

Con Ruby 1.9 (credo) possiamo sfruttare il metodo group\_by, che e’  
definito anche in Rails:

> > pool = %w(m m f g f m f g m m g f)  
> > =\> [“m”, “m”, “f”, “g”, “f”, “m”, “f”, “g”, “m”, “m”, “g”, “f”]
> 
> > pool.group\_by {|x| x}.values.flatten  
> > =\> [“m”, “m”, “m”, “m”, “m”, “f”, “f”, “f”, “f”, “g”, “g”, “g”]

Per versioni di ruby precedenti, si puo’ definire il metodo group\_by:

module Enumerable  
def group\_by  
assoc = Hash.new  
each do |element|  
key = yield(element)  
if assoc.has\_key?(key)  
assoc[key] \<\< element  
else  
assoc[key] = [element]  
end  
end  
assoc  
end  
end

---

<div class="post-metadata">

**Author:** ![Giovanni\_I](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4491bb/32.png) [@Giovanni\_I](https://www.ruby-forum.com/u/Giovanni_I)\
**Post date:** [September 25, 2008, 3:00pm UTC](https://www.ruby-forum.com/t/il-problema-di-matteo-allrsc/149502/8 "2008-09-25T15:00:36Z")

</div>

On Sep 25, 2008, at 2:53 PM, Claudio Petasecca D. wrote:

> Con Ruby 1.9 (credo) possiamo sfruttare il metodo group\_by, che e’  
> definito anche in Rails:

anche ruby 1.8.7
