Soluzione Ordered (a)

21 Feb 2017

Soluzione Ordered (a)

def ordered(a)
  # Per prima cosa controlliamo che in ingresso abbiamo un Array di tutti
  # numeri (il secondo controllo si potrebbe effettuare dentro il loop
  # dell'algoritmo per maggiore efficienza, lo mettiamo fuori per
  # maggiore chiarezza)
  raise ArgumentError, "Ci vuole un Array in ingresso" unless a.is_a? Array
  a.each do |z|
    raise ArgumentError,
      "Tutti gli elementi dell'Array devono essere Numeric" unless z.is_a? Numeric
  end

  # Adesso ci occupiamo del vero e proprio algoritmo, costruendo
  # prima un Array vuoto r che porterà fuori la soluzione e un Array
  # temporaneo b con il primo elemento di a (a[0])
  r, b = [], [a[0]]

  # Si esegue un ciclo (ne basta uno) da 1 a (a.size - 1)
  for i in 1...(a.size)
    # controlliamo se l'elemento che stiamo analizzando è
    # strettamente decrescente rispetto all'ultimo elemento
    # del vettore b. Se lo è lo aggiungiamo alla fine di b.
    if b[-1] > a[i]
      b << a[i]

    # Altrimenti, inseriamo b dentro l'insieme dei risultati r
    # e inizializziamo il nuovo b con il valore corrente di
    # a, ovvero a[i].
    else
      r << b
      b = [a[i]]
    end
  end
  # Ritorniamo r, ma prima dobbiamo aggiungere l'ultimo stato di
  # b, che non può mai incontrare la situazione di aggiunta
  return r << b

  # Questa è una delle tante possibili soluzioni per questo problema,
  # si potrebbero usare cicli nidificati.
end