Ruby: округлить число до ближайшего числа на основе произвольного списка чисел

Скажем, у меня есть массив целых чисел:

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

и у меня есть другое целое число:

n = 6

Мне нужна функция, которая округляет до ближайшего числа из массива:

foo(n) #=> 5

Как видите, числа не имеют фиксированного шаблона. Какой элегантный способ сделать это?

Спасибо


person user94154    schedule 01.07.2010    source источник
comment
Конечно, ваше утверждение n = 6.5 не определяет целое число. Я полагаю, что это опечатка с вашей стороны.   -  person High Performance Mark    schedule 01.07.2010
comment
да мой плохой. я решал, хочу ли я спросить о числах с плавающей запятой/фиксированных числах и т. д., и выбрал то, что действительно имело значение, а именно алгоритм.   -  person user94154    schedule 01.07.2010


Ответы (2)


Используйте select, а затем max:

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

Результат:

5

Это выполняется за линейное время и не требует сортировки массива.

person Mark Byers    schedule 01.07.2010

Если вы используете относительно небольшие массивы (и поэтому не слишком беспокоитесь об эффективности), то это должно работать нормально:

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

E.g:

myarr = [0,5,7,8,11,16]
puts down_to_array 6.5, myarr #=> 5
person unignorant    schedule 01.07.2010
comment
Хороший ответ. Я хотел бы просто добавить эту ссылку ruby-doc.org/core/classes/ Enumerable.html#M003120 так вы можете запустить тест sort_by, чтобы проверить, является ли это хорошим решением для ваших массивов. - person dierre; 01.07.2010