Снежана обнови решението на 15.10.2012 15:55 (преди около 12 години)
+class Integer
+ def is_prime?
+ numbers = (2..self**0.5)
+ numbers.each { |numb| return false if self % numb == 0 }
+ true
+ end
+
+ def prime_divisors
+ array = []
+ prime_div = (2..self.abs).each { |n| array << n if self.abs % n == 0 and n.is_prime? }
+ array
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = self.to_a
+ result.each_with_index do |n, i|
+ case
+ when n % 15 == 0
+ result[i] = :fizzbuzz
+ when n % 3 == 0
+ result[i] = :fizz
+ when n % 5 == 0
+ result[i] = :buzz
+ end
+ end
+ result
+ end
+end
+
+class Hash
+ def group_values
+ newhash = {}
+ each do |n,i|
+ if newhash.has_key? i
+ newhash[i] << n
+ else
+ newhash[i] = [n]
+ end
+ end
+ newhash
+ end
+end
+
+class Array
+ def densities
+ newarray = []
+ each { |n| newarray << count(n) }
+ newarray
+ end
+end
- Кодът ти е чист и добре подреден, което ме радва :)
-
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция; при теб го има на 1-2 места, напр. ред 10 и 17 - Шаблонът
list = []; ...each { |x| list << x }; list
се наричаmap
и трябва да ползваш него :) -
fizzbuzz
иdensities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
:) - Не, че е неприемлив вариант, но ред 36 до 40 обикновено се записват така:
newhash[i] ||= []; newhash[i] << n
(на два реда и не с тези имена на променливи, но схващаш идеята) - Ако беше на последната лекция, сигурно вече знаеш, че променливи, кръстени
numb
,prime_div
и прочее не са много добри имена; сходно е положението донякъде и с еднобуквените имена; например, на 35-ти ред ползвашn
иi
, като по-скоро очаквам да видя тамkey
иvalue
и тези имена ме изненадват; не е добре да изненадваш човека, който чете кода по този начин :) -
is_prime?
по-скоро се кръщаваprime?
, тъй като въпросителната накрая достатъчно ясно показва, че методът е предикат
На сбирката днес ще си говорим за Enumerable
и ще видиш как с помощта на някои други методи като any?
, all?
и прочее може да се пренапишат някои от твоите, например, is_prime?