Цветан обнови решението на 13.10.2013 14:05 (преди около 11 години)
+class Integer
+ def prime?
+ return false if self < 2
+ numbers = 2.upto(Math.sqrt(abs))
+ numbers.all? do |number|
+ abs % number != 0
+ end
+ end
+
+ def prime_factors
+ find_prime_factors([], 2, self)
+ end
+
+ def find_prime_factors(list_of_dividers, current_divider, current_number)
+ while current_divider <= abs
+ if current_divider.prime? and current_number % current_divider == 0
+ list_of_dividers << current_divider
+ current_number = current_number / current_divider
+ else
+ current_divider = current_divider + 1
+ end
+ end
+
+ list_of_dividers
+ end
+
+ def harmonic
+ return nil if self <= 0
+ result = Rational(1, 1)
+ (2..self).each do |number|
+ result = result + Rational(1, number)
+ end
+
+ result
+ end
+
+ def digits
+ abs.to_s.split('').map { |e| Integer(e) }
+ end
+end
+
+class Array
+ def average
+ return nil if empty?
+ result = 0.0
+ each { |e| result = result + e }
+
+ result / length
+ end
+
+ def drop_every(n)
+ result = []
+ each_index do |index|
+ result << self[index] if (index + 1) % n != 0
+ end
+
+ result
+ end
+
+ def frequencies
+ occurences = {}
+ each do |number|
+ if occurences.has_key?(number)
+ occurences[number] = occurences[number] + 1
+ else
+ occurences[number] = 1
+ end
+ end
+
+ occurences
+ end
+
+ def combine_with(other_list)
+ smallest_length = other_list.length < length ? other_list.length : length
+ result = []
+ (0..smallest_length - 1).each do |number|
+ result << self[number] << other_list[number]
+ end
+ adding_remaining_elements(smallest_length, other_list, result)
+
+ result
+ end
+
+ def adding_remaining_elements(smallest_length, other_list, result)
+ if smallest_length == length
+ other_list[smallest_length..other_list.length - 1].each{ |x| result << x }
+ else
+ self[smallest_length..length - 1].each{|x| result << x}
+ end
+ end
+end
Ето малко бележки:
- В твоя случай на употреба на
all?
(ред 5), е по-добре да е на един ред, достатъчно четимо ще е - Там,
numbers
не ми харесва като име; това еlimit
или нещо от сорта - Виждам, че си решил
prime_factors
малко в стил Lisp/Scheme :) Това ме е точно Руби стил, но имената ти са прилични, с малки изключения –dividers
означава "разделители"; може би имаш предвидdivisors
? :) - Red 20 - може да ползваш
+=
там - Предпочитаме вариантите с думи на проверката за делимост, т.е.
remainder(number)
,zero?
иnonzero?
-
return nil if self <= 0
може да се запише и катоreturn if self <= 0
- За
harmonic
виж далиreduce
няма да ти свърши работа по някакъв начин; същото важи и заaverage
- Ред 38 - вж.
Stirng#chars
иString#to_i
- Имаш typo в
occurences
(изпуснал си едноr
) - За
frequencies
, виж конструктора на Hash и виж дали няма да ти свърши работа някоя негова алтернативна версия -
result
не е добро име; дали ще бъдеremaining_elements
(ред 52) илиcombined_elements
, или самоcombined
- това е по-добре отresult
-
adding_remaining_elements
не е кръстено правилно; трябва да е понеadd_remaining_elements
- Още повече, този метод си го извел заради skeptic; това не го одобрявам, опитай да пренапишеш
combine_with
така, че да няма нужда от това; разгледай методите наArray
и наEnumerable
(вторите ги има във всекиArray
), може някои от тях да са ти полезни