Цветан обнови решението на 13.10.2013 14:05 (преди около 12 години)
+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), може някои от тях да са ти полезни
