Йордан обнови решението на 15.10.2012 12:56 (преди около 12 години)
+class Integer
+ def prime_divisors
+ return (-self).prime_divisors if self < 0
+ return nil if [0,1].include? self
+ def prime? n
+ not (2...n).map {|x| n % x}.include? 0
+ end
+ (2...self).to_a.delete_if { |x| not prime? x or not self % x == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ def map_f n
+ if n % 3 == 0 and n % 5 == 0
+ :fizzbuzz
+ elsif n % 3 == 0
+ :fizz
+ elsif n % 5 == 0
+ :buzz
+ else
+ n
+ end
+ end
+ self.map { |x| map_f x }
+ end
+end
+
+class Hash
+ def group_values
+ ans = {}
+ def insert_key ans, k, v
+ if ans[v] == nil
+ ans[v] = [k]
+ else
+ ans[v] << k
+ end
+ end
+ self.each { |k, v| insert_key ans, k, v }
+ ans
+ end
+end
+
+class Array
+ def densities
+ self.map { |x| self.count x }
+ end
+end
-
Никога не дефинирай метод в метод с
def
; Ruby не еLisp
,JavaScript
или друг език, където това би имало друг, очакван ефект; тук стават неща, които не очакваш и не сме го показвали така; ако искаш да обособиш метод, или си правишlambda
, или си извеждаш метода в същия или нов клас - Допълнително, идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
- В
Range#fizzbuzz
, например, няма нужда да извеждаш отделен метод, можеше просто да напишешmap do ...
и да сложиш след това в блока тялото на този метод с ужасното имеmap_f
- Вероятно знаеш, ако си бил на последната лекция, че имена като
ans
са зле избрани и че трябва да се постараеш повече в това направление следващия път -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - Ред 33 до 37 обикновено се записват така:
ans[v] ||= []; ans[v] << k
(само че на два реда; и игнорирам лошите имена на променливи тук) -
нещо % 3 == 0 and нещо % 5 == 0
може да се запише и по-кратичко —нещо % 15 == 0
... :) - Да мутираш списък не е много добра идея в случая (визирам
delete_if
). Може да го избегнеш с помощта наselect
. Старай се да избягваш мутиране, докато не свикнеш сmap
,select
,reject
и прочее методи отEnumerable
Ruby изисква малко време човек да свикне с него, но после се отплаща многократно. Постарай се да нагодиш мисленето си в Ruby-идиоми и ще видиш, че ще имаш полза дори в ежедневното си писане на C#, ако щеш.
Благодаря : )