2010-07-01 4 views
9

dire che ho un array di interi:Rubino: cifra tonda fino al più vicino numero in base elenco arbitrario di numeri

arr = [0,5,7,8,11,16] 

e ho un altro intero:

n = 6 

Ho bisogno di una funzione che giri verso il basso per il numero più vicino dalla matrice:

foo(n) #=> 5 

Come si può vedere, i numeri non hanno uno schema fisso. Qual è un modo elegante per farlo?

Grazie

+2

Ovviamente, l'istruzione n = 6.5 non definisce un numero intero. Mi aspetto che sia un errore di battitura da parte tua. –

+0

sì mio male. Stavo decidendo se volevo chiedere dei float/fixnum, ecc. e sono andato per quello che contava davvero, che era l'algoritmo. – user94154

risposta

14

Usa select seguito da max:

arr = [0,5,7,8,11,16] 
puts arr.select{|item| item < 6}.max 

Risultato:

5 

Questo viene eseguito in tempo lineare e non richiede che l'array è ordinato.

+2

bellissimo. uno dei motivi per cui amo Ruby. Grazie molto! – user94154

1

Se si utilizza relativamente piccoli array (e quindi non eccessivamente preoccupato per l'efficienza), allora questo dovrebbe funzionare bene:

def down_to_array num, arr 
    arr.select{|y| y < num}.sort_by{|z| num-z }.first 
end 

Esempio:

myarr = [0,5,7,8,11,16] 
puts down_to_array 6.5, myarr #=> 5 
+0

Bella risposta. Vorrei solo aggiungere questo link http://ruby-doc.org/core/classes/Enumerable.html#M003120 che è come eseguire un benchmark su sort_by per verificare se è una buona soluzione con i tuoi array. – dierre