2010-07-01 12 views
9

decir que tengo una matriz de enteros:Ruby: número redondo hasta el número más cercano basado en lista arbitraria de números

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

y tengo otro número entero:

n = 6 

Necesito una función que rondas abajo al número más cercano de la matriz:

foo(n) #=> 5 

Como se puede ver, los números no tienen un patrón fijo. ¿Cuál es una manera elegante de hacer esto?

Gracias

+2

Por supuesto, su extracto n = 6.5 no define un entero. Supongo que es un error de tu parte. –

+0

sí, mi mal. Estaba decidiendo si quería preguntar sobre flotadores/fixnums, etc. y fui por lo que realmente importaba, que era el algoritmo. – user94154

Respuesta

14

Uso select seguido de max:

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

Resultado:

5 

Esto se ejecuta en tiempo lineal y no requiere que la matriz está ordenada.

+2

hermosa. una de las razones por las que amo a Ruby. ¡Muchas gracias! – user94154

1

Si está utilizando matrices relativamente pequeñas (y por lo tanto no excesivamente preocupados por la eficiencia), entonces esto debería funcionar bien:

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

Ej:

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

Buena respuesta. Me gustaría simplemente agregar este enlace http://ruby-doc.org/core/classes/Enumerable.html#M003120 que es cómo se puede ejecutar un punto de referencia en sort_by para comprobar si es una buena solución con sus matrices. – dierre

Cuestiones relacionadas