2010-07-01 8 views
9

Say Mam tablicę liczb całkowitych:Ruby: numer okrągły dół do najbliższej liczby w oparciu o arbitralne listę numerów

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

i mam inną liczbę całkowitą:

n = 6 

Potrzebuję funkcję zaokrągla w dół do najbliższej liczby z tablicy:

foo(n) #=> 5 

Jak widać, liczby nie mają ustalonego wzorca. Jaki jest elegancki sposób na zrobienie tego?

Dzięki

+2

Oczywiście twój wyciąg n = 6.5 nie definiuje liczby całkowitej. Oczekuję, że to literówka z twojej strony. –

+0

tak, moje złe. decydowałem, czy chciałem zapytać o pływaki/fixnums, itp. i poszedłem na to, co naprawdę miało znaczenie, co było algorytmem. – user94154

Odpowiedz

14

Zastosowanie select następnie max:

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

Wynik:

5 

ten działa w czasie liniowym i nie wymaga, że ​​tablica jest posortowana.

+2

piękne. jeden z powodów, dla których kocham Ruby. Wielkie dzięki! – user94154

1

Jeśli używasz stosunkowo małych tablic (a więc nie są zbyt zaniepokojeni sprawność), to powinno zadziałać:

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

np

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

Dobra odpowiedź. Chciałbym tylko dodać ten link http://ruby-doc.org/core/classes/Enumerable.html#M003120, w ten sposób można uruchomić benchmark na sort_by, aby sprawdzić, czy jest to dobre rozwiązanie z tablicami. – dierre

Powiązane problemy