Красимира обнови решението на 13.10.2013 21:54 (преди около 11 години)
+class Integer
+ def prime?
+ return false if self < 2
+ 2.upto(pred).all? { |divisor| remainder(divisor) != 0 }
+ end
+
+ def prime_factors
+ return [] if abs < 2
+ divisor = 2.upto(abs).find { |divisor| remainder(divisor) == 0 }
+ [divisor] + abs.div(divisor).prime_factors
+ end
+
+ def harmonic
+ 1.upto(self).map { |number| Rational(1,number) }.inject(:+)
+ end
+
+ def digits
+ abs.to_s.chars.map(&:to_i)
+ end
+end
+
+
+class Array
+ def frequencies
+ result = {}
+ each do |element|
+ result[element] ||= 0
+ result[element] += 1
+ end
+ result
+ end
+
+ def average
+ inject(:+).fdiv(count) unless empty?
+ end
+
+ def drop_every(n)
+ values_at(*each_index.reject { |index| (index + 1) % n == 0 })
+ end
+
+ def combine_with(other)
+ smaller_length = [self, other].map(&:length).min
+ remainder = drop(smaller_length) + other.drop(smaller_length)
+ zip(other).flatten.take(2 * smaller_length) + remainder
+ end
+end
Много добро решение, браво!
Малко бележки:
- Предпочитаме вариантите с думи на проверката за делимост, т.е.
remainder(number)
,zero?
иnonzero?
- Все пак, обаче, ползваме
/
за делене, вместоdiv
- На ред 14 трябва да има интервал след
,
- Предпочитаме
reduce
предinject
- Само един празен ред между дефиницията на двата класа се оставя
-
result
е кофти име на променлива (ред 25); спокойно може да е понеfrequencies
- За
frequencies
, виж конструктора на Hash и виж дали няма да ти свърши работа някоя негова алтернативна версия - За
fdiv
съм раздвоен; аз бих го написалreduce(:+) / size.to_f unless empty?
- Предпочитаме
size
предlength
и предcount
;count
се ползва в други случаи, защото е по-мощен метод от предите две - Кодът на ред 42 е излишно "DRY"-нат (говоря за map-а); по-добре е да го напишеш
[size, other.size].min
Би ли споделила откъде разбра за map(&:to_i)
, map(&:length)
, foo(*array)
, както и за всички други методи, които все още не сме показвали, но си използвала (съвсем на място) в решението си? Занимавала ли си се преди с Ruby?
Мерси за коментара и за забележките. Не съм се занимавала с Ruby, разрoвих се в документацията и видях примери. За foo(*array) знам от Python :)