Помогите с медианой в рубине - PullRequest
1 голос
/ 26 апреля 2011

Я пишу скрипт ruby, который будет получать числа и выводить медиану. Это мой код

numbers = Array.new    
numbers = [gets]     
def median(numbers)     
    sorted = numbers.sort
    mid = numbers.length/2 sorted[mid] 
    numbers.push mid    
end 
end

Когда вы запускаете его, он запрашивает цифры, но не дает медиану ...

Ответы [ 5 ]

3 голосов
/ 17 февраля 2013
def median(array)
  array.sort!
  if array.length % 2 == 0
    median_value = (array[array.length / 2] + array[array.length/2 - 1]) / 2.0
  else
    median_value = array[array.length / 2]
  end
end
2 голосов
/ 26 апреля 2011

Вы никогда не вызываете медианный метод, вы только определяете его.

1 голос
/ 26 апреля 2011

Здесь есть несколько проблем:

  1. У вас есть дополнительное ключевое слово end, которое из того, что вы здесь разместили, не нужно.
  2. gets возвращаетстрока.Например, вы можете собрать разделенное пространство чисел и создать из него массив.
  3. Вы не звоните median, поэтому он не даст вам медиану.

Так что-то вроде этого будет работать:

def median(numbers)     
    sorted = numbers.sort
    numbers[numbers.length/2]  
end 

p median(gets.split(' '))
1 голос
/ 26 апреля 2011

Вот некоторые обезьяньи патчи, которые я использую на Enumerable, включая одну для медианы:

module Enumerable
  # Does not sort the values; do this yourself before calling if you like
  def median( &blk )
    values = blk ? map( &blk ) : self
    values[ values.length / 2 ]
  end
  def sum( &blk )
    values = blk ? map( &blk ) : self
    values.inject(0){ |sum,v| sum + v }
  end
  def average( &blk )
    (length==0) ? 0 : (sum( &blk ) * 1.0 / length)
  end
  alias_method :avg, :average
  def std_dev( &blk )
    values = blk ? map( &blk ) : self
    mean = values.average
    Math.sqrt( values.map{ |value| (value-mean)*(value-mean) }.average )
  end
  def dups_by
    keyvals = Hash.new{|h,v|h[v]=[]}
    each{ |v|   keyvals[yield(v)] << v }
    result = []
    keyvals.each{ |k,v| result << v if v.length > 1 }
    result
  end  
end
1 голос
/ 26 апреля 2011

Это домашнее задание?

Сначала убедитесь, что ваши данные соответствуют вашим ожиданиям. Я поместил ваш код в файл с именем median.rb и запустил rdebug. Обратите внимание на содержимое массива чисел после [получает]

$ rdebug median.rb
median.rb:1
numbers = Array.new
(rdb:1) n
median.rb:2
numbers = [gets] 
(rdb:1) n
1 2 3 4 5 6 7
median.rb:5
def median(numbers) 
(rdb:1) p numbers
["1 2 3 4 5 6 7\n"]
(rdb:1) p numbers[0]
"1 2 3 4 5 6 7\n"
(rdb:1) p numbers[0].class
String
(rdb:1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...