Калоян обнови решението на 13.10.2013 21:07 (преди около 11 години)
+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-а :)