def get_median(values)
quotient, remainder = values.sort!.length.divmod(2)
medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq
medians.length > 1 ? medians.map(&:to_f).reduce(:+) / 2 : medians[0]
end
This should work, but let me know if it does not.
edit forgot to add .to_f to medians values. Here is my testing in Pry.
[1] pry(main)> def get_median(values)
[1] pry(main)* quotient, remainder = values.sort!.length.divmod(2)
[1] pry(main)* medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq
[1] pry(main)* medians.length > 1 ? medians.map { |v| v.to_f }.reduce(:+) / 2 : medians[0]
[1] pry(main)* end
=> nil
[2] pry(main)> values = [1,2,3]
=> [1, 2, 3]
[3] pry(main)> get_median values
=> 2
[4] pry(main)> values << 4
=> [1, 2, 3, 4]
[5] pry(main)> get_median values
=> 2.5
[6] pry(main)> get_median values << -1
=> 2
[7] pry(main)> values
=> [-1, 1, 2, 3, 4]
[8] pry(main)> values << 11
=> [-1, 1, 2, 3, 4, 11]
[9] pry(main)> get_median values << -1
=> 2
[10] pry(main)> values
=> [-1, -1, 1, 2, 3, 4, 11]
[11] pry(main)> values.delete_if { |v| v == -1}
=> [1, 2, 3, 4, 11]
[12] pry(main)> values << -1
=> [1, 2, 3, 4, 11, -1]
[13] pry(main)> get_median values
=> 2.5
[14] pry(main)>