Ruby/Method/Utility Method

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

Содержание

Converting Between Degrees and Radians

class Numeric
  def degrees
    self * Math::PI / 180
  end
end
puts 90.degrees
puts Math::tan(45.degrees)                             # => 1.0
puts Math::cos(90.degrees)                             # => 6.12303176911189e-17
puts Math::sin(90.degrees)                             # => 1.0
puts Math::sin(89.9.degrees)                           # => 0.999998476913288
puts Math::sin(45.degrees)                             # => 0.707106781186547
puts Math::cos(45.degrees)                             # => 0.707106781186548



mean and standard deviation

def mean(array)
  array.inject(0) { |sum, x| sum += x } / array.size.to_f
end
def mean_and_standard_deviation(array)
  m = mean(array)
  variance = array.inject(0) { |variance, x| variance += (x - m) ** 2 }
  return m, Math.sqrt(variance/(array.size-1))
end
puts mean_and_standard_deviation([1,2,3,1,1,2,1])
puts mean_and_standard_deviation([1,2,3,1,1,2,1000])



mean without float conversion

def mean(array)
  array.inject(0) { |sum, x| sum += x } / array.size.to_f
end
def mean_without_float_conversion(array)
  array.inject(0) { |x, sum| sum += x } / array.size
end
require "rational"
numbers = [Rational(2,3), Rational(3,4), Rational(6,7)]
puts mean(numbers)
puts mean_without_float_conversion(numbers)



Taking Mean

def mean(array)
  array.inject(0) { |sum, x| sum += x } / array.size.to_f
end
puts mean([1,2,3,4])                                  # => 2.5
puts mean([100,100,100,100.1])                        # => 100.025
puts mean([-100, 100])                                # => 0.0
puts mean([3,3,3,3])                                  # => 3.0



Track Median

 
def mean(array)
  array.inject(0) { |sum, x| sum += x } / array.size.to_f
end
 
def median(array, already_sorted=false)
  return nil if array.empty?
  array = array.sort unless already_sorted
  m_pos = array.size / 2
  return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])
end
puts median([1,2,3,4,5])                             # => 3
puts median([5,3,2,1,4])                             # => 3
puts median([1,2,3,4])                               # => 2.5
puts median([1,1,2,3,4])                             # => 2
puts median([2,3,-100,100])                          # => 2.5
puts median([1, 1, 10, 100, 1000])                   # => 10



Track Mode

def modes(array, find_all=true)
  histogram = array.inject(Hash.new(0)) { |h, n| h[n] += 1; h }
  modes = nil
  histogram.each_pair do |item, times|
    modes << item if modes && times == modes[0] and find_all
    modes = [times, item] if (!modes && times>1) or (modes && times>modes[0])
  end
  return modes ? modes[1...modes.size] : modes
end
puts modes([1,2,3,4])                                # => nil
puts modes([1,1,2,3,4])                              # => [1]
puts modes([1,1,2,2,3,4])                            # => [1, 2]
puts modes([1,1,2,2,3,4,4])                          # => [1, 2, 4]
puts modes([1,1,2,2,3,4,4], false)                   # => [1]
puts modes([1,1,2,2,3,4,4,4,4,4])                    # => [4]