Николай обнови решението на 15.10.2012 12:47 (преди около 12 години)
+class Integer
+ def prime_divisors
+ result = []
+
+ prime = (1..self).select do |number|
+ count = 0
+
+ (1..number).each do |n|
+ count += 1 if number % n == 0
+ end
+
+ if count == 2
+ true
+ else
+ false
+ end
+ end
+
+ remainder = self
+
+ while remainder != 1
+ prime.each do |n|
+ if remainder % n == 0
+ result << n
+ remainder = remainder / n
+ break
+ end
+ end
+ end
+
+ result.uniq
+ end
+end
+
+class Range
+ def fizzbuzz
+ numbers = self.to_a
+ result = []
+
+ numbers.each do |n|
+ if n % 3 == 0 && n % 5 != 0
+ result << :fizz
+ elsif n % 5 == 0 && n % 3 != 0
+ result << :buzz
+ elsif n % 3 == 0 && n % 5 == 0
+ result << :fizzbuzz
+ else
+ result << n
+ end
+ end
+
+ result
+ end
+end
- Идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
- Шаблонът
list = []; ...each { |x| list << x }; list
се наричаmap
и трябва да ползваш него :) (например вRange#fizzbuzz
) -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - Редове 6 до 10 може да ги напишеш, ползвайки варианта на
Enumerable#count
, който приема блок (ще го споменем на презентацията довечера, но може да си провериш документацията му и сам) - Редове 12 до 16 са по-известни като
count == 2
, което си връща boolean така или иначе... :) - Цикълът
while
вprime_divisors
е по-добре да се напише пак съсselect
-
Range#fizzbuzz
иArray#densities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
:)
Ако не си бил на последната сбирка, виж примерното решение, което сме дали в презентацията от тогава и също виж решенията, на които сме дали бонус точки.