Калоян обнови решението на 13.10.2013 21:07 (преди около 12 години)
+class Integer
+ def prime?
+ return false if self < 2
+ 2.upto(self-1).all? { |e| self.remainder(e).nonzero? }
+ end
+
+ def primes_upto n
+ self.upto(n).select { |e| e.prime? }
+ end
+
+ def prime_dividers
+ 2.primes_upto(self).select { |prime| self.remainder(prime).zero? }
+ end
+
+ def times_divided_by n
+ result = 0
+ until self.remainder(n).nonzero?
+ n *= n
+ result += 1
+ end
+ result
+ end
+
+ def prime_factors
+ self.prime_dividers.collect { |f| [f] * self.times_divided_by(f) }.flatten
+ end
+
+ def harmonic
+ 1.upto(self).inject(Rational(0)) { |sum,e| sum + Rational(1,e) }
+ end
+
+ def digits
+ self.abs.to_s.split("").collect { |c| c.to_i }
+ end
+end
+
+class Array
+ def frequencies
+ result = {}
+ self.each do |e|
+ result.store(e, 0) unless result.member? e
+ result[e] += 1
+ end
+ result
+ end
+
+ def average
+ self.inject(0.0, :+) / self.length
+ end
+
+ def drop_every n
+ result = []
+ self.each_slice(n) do |e|
+ result += if e.length == n then e[0...-1] else e end
+ end
+ result
+ end
+
+ def combine_with other
+ max = [self.length, other.length].max
+ (0..max).collect { |i| [self[i], other[i]] }.flatten.compact
+ end
+end
Малко бележки:
- Идентацията на кода ти не е както трябва; консултирай се с ръководството по стил;
- Конвенция - ред 4 - трябва да има интервали около
- - Пак там,
self - 1еpred - Конвенция - ред 29 - трябва да има интервал след
, - Слагай скоби около дефиницията на методи, когато те имат аргументи (вж. секция Syntax в ръководството по стил)
- Имена като
result,e,c,fса лоши; съкращавайки няколко символа, не печелиш нищо, а губиш много; стреми се да спазваш clarity over brevity - Предпочитаме
mapпредcollectиreduceпредinject -
self.се "подразбира", когато предшества извикване на метод (ще го кажем по-натам) и е излишен; в почти всички такива случаи се пропуска (напр. ред 8, 12, 17, 25, 33, ...) - Ред 33, виж какво прави
String#charsи опитай да измислиш по-добро име наcв този контекст - За да сложиш нещо в хеш, не ползваш
store, a[]=, т.е.hash[key] = value - Ред 41 - за да провериш дали вече няма число в хеша, може да ползваш и само
... unless result[e](тукresultиeса лоши имена); вместо result, спокойно може да ползвашfrequencies, аe=element - Ред 54 - или ползвай тернарния оператор
foo ? bar : baz, или, по-добре, нормален if/else; това не е много четимо - Ред 60,
maxе по-лошо име, от,larger_size, например - Предпочитаме
sizeпредlength
Да и аз си викам вчера, че по някое време трабва да седна да прочета Style Guide-а :)
