Кристиан обнови решението на 13.10.2013 00:10 (преди около 11 години)
+class Integer
+ def prime?
+ return false if self < 2
+ not (2..(self / 2).ceil).map { |x| self % x == 0 }.any?
+ end
+
+ def times_divisible_by(x, current = self)
+ if current % x == 0
+ 1 + times_divisible_by(x , current / x)
+ else
+ 0
+ end
+ end
+
+ def prime_factors
+ primes = (2..self.abs).select(&:prime?)
+ primes.map { |x| Array.new(self.times_divisible_by(x), x) }.flatten
+ end
+
+ def harmonic
+ (1..self).map { |x| 1r/ x }.reduce(:+)
+ end
+
+ def digits
+ self.abs.to_s.chars.map { |x| Integer(x) }
+ end
+end
+
+class Array
+ def frequencies
+ self.reduce(Hash.new(0)) do |map, x|
+ map[x] += 1
+ map
+ end
+ end
+
+ def average
+ self.reduce(0.0, :+) / self.length
+ end
+
+ def drop_every(n)
+ self.each_with_index.select { |_ , i| (1 + i) % n != 0 }.map(&:first)
+ end
+
+ def combine_with(other)
+ if self.length < other.length
+ first = self
+ left_over = other.drop(first.length)
+ else
+ first = self.take(other.length)
+ left_over = self.drop(first.length)
+ end
+
+ (first.zip(other) << left_over).flatten
+ end
+end
Ето малко бележки:
- На ред 4,
any?
може да се извиква и с блок; виж дали има как да го ползваш; освен това, вместоnot ...any?
, може да ползвашnone?
- Недостатъчно добре четим е този израз в range-а на ред 4; изведи горната граница в променлива
- Допълнително, предпочитаме вариантите с думи на проверката за делимост, т.е.
remainder(number)
и методитеzero?
иnonzero?
-
x
не е добро име;number
е по-добро - Доста извратен начин си намерил да напишеш
prime_factors
- трудно се разбира :) Между другото, може да ползвашflat_map
там, вместоmap { ... }.flatten
-
self.
се "подразбира", когато предшества извикване на метод (ще го кажем по-натам) и е излишен; в почти всички такива случаи се пропуска (напр. ред 16, 17, 25, 31, 38...) - Ред 21, трябва интервал преди
/
- Ред 25, методът, който търсиш, е
String#to_i
- Ред 31,
map
е лошо име;frequencies
е по-добро; предпочитам иx
да е кръстеноelement
- Ред 42,
reject
е по-близо до идеята наdrop_every
, отколкотоselect
, според мен; дургото е интересно решение - "leftover" е една дума :) и някак си не ми се връзва с "first"; пробвай да намериш друга комбинация от думи; може би "head" + "tail" ми звучи по-добре, дори, отколкото тези двете
Иначе, решението ти е прилично, поздравления!