Методи обнови решението на 15.10.2012 16:20 (преди около 12 години)
+class Integer
+ def prime?
+ array_of_integers = (2..self.abs/2).to_a
+ array_of_integers.each do |i|
+ if self % i == 0 and i != self
+ return false
+ end
+ end
+ true
+ end
+ def prime_divisors
+ (2..self.abs-1).collect {|n| n if self % n == 0 and n.prime?}.compact.to_a
+ end
+end
+class Range
+ def fizzbuzz
+ s = self.collect do |n|
+ if n % 3 == 0 and n % 5 == 0
+ :fizzbuzz
+ elsif n % 3 == 0
+ :fizz
+ elsif n % 5 == 0
+ :buzz
+ else
+ n
+ end
+ end
+ s.compact.to_a
+ end
+end
+class Hash
+ def group_values
+ result_hash = Hash.new()
+ self.each do |key, value|
+ result_hash[value] = self.collect {|key1, value1| key1 if self[key1] == value}.compact.to_a
+ end
+ result_hash
+ end
+end
+class Array
+ def densities
+ self.collect { |n| self.count(n)}.to_a
+ end
+end
- Идентацията ти не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
-
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - На места на един ред си сгъчкал твърде много логика и кодът ти е станал трудно разбираем; това трябва да се избягва
- В
densities
нямаш нужда отto_a
накрая - Предпочитай
map
предcollect
(синоними са, но първото се предпочита) - В
Range#fizzbuzz
можеш спокойно да пропуснеш 28-ми ред - Не разбирам и кавка е тази обсесия да викаш ненужни методи, напр.
compact
на няколко места - На 3-4-ти ред не ти трябва да правиш списък, можеш направо да си обхождаш с
each
range-а -
нещо % 3 == 0 and нещо % 5 == 0
може да се запише и по-кратичко —нещо % 15 == 0
... :)
Ползвам compact, защото след collect там където условието на "щипките" не се удовлетворява ми добавя елемент null, така ги премахвам. За map вместо collect не се сетих.
Разбираш, че можеш да ползваш select
вместо map.compact
, нали така?
Да, select звучи по-добре.