Soluzione Ordered (c)

21 Feb 2017

Soluzione Ordered (c)

def ordered(a)
  # Valutiamo che l'ingresso sia valido
  # per valutare che contenga tutti numeri non usiamo il
  # metodo più efficiente, ma il più semplice
  raise ArgumentError, "a deve essere un Array" unless a.is_a? Array
  a.each do |z|
    raise ArgumentError, "a deve contenere Numeric" unless z.is_a? Numeric
  end

  # Usiamo una soluzione che non è la più efficiente. Salviamo tutte le
  # sequenze crescenti, poi le mettiamo in un hash, valutandone la dimensione
  b = []
  c = [a[0]]
  for i in 1...a.size
    if a[i] > c[-1]
      c << a[i]
    else
      b << c.dup
      c = [a[i]]
    end
  end
  b << c.dup

  # A questo punto c non ci serve più. b è un array di array che sono
  # strettamente decrescenti, contiene anche elementi di dimensione 1
  r = {}
  b.each do |e|
    next if e.size == 1 # scartiamo le dimensioni 1
    r[e.size] = [] unless r.keys.include? e.size # creo la chiave
                                                  # se manca
    r[e.size] << e
  end

  return r
end