Йордан обнови решението на 15.10.2012 11:58 (преди около 12 години)
+class Integer
+ def is_prime?
+ (2...self).each { |n| return false if self % n == 0 }
+ true
+ end
+
+ def prime_divisors
+ pd_array = []
+ (2..abs).each { |n| pd_array << n if self % n == 0 and n.is_prime? }
+ pd_array
+ end
+end
+
+class Range
+ def fizzbuzz
+ fb_aray = []
+ each do |n|
+ if n % 3 == 0 and n % 5 == 0
+ fb_aray << :fizzbuzz
+ elsif n % 3 == 0
+ fb_aray << :fizz
+ elsif n % 5 == 0
+ fb_aray << :buzz
+ else
+ fb_aray << n
+ end
+ end
+ fb_aray
+ end
+end
+
+class Hash
+ def group_values
+ gv_hash = Hash.new { |hash, key| hash[key] = Array.new }
+ each { |key, value| gv_hash[value] << key }
+ gv_hash
+ end
+end
+
+class Array
+ def times_found element
+ counter = 0
+ each { |n| counter += 1 if element == n }
+ counter
+ end
+
+ def densities
+ densities_array = []
+ each { |n| densities_array << times_found(n) }
+ densities_array
+ end
+end
- Виждам, че има някаква логика в именоването на тези променливи, но все пак
pd_array
,fb_array
,gv_hash
и прочее не са много добри имена на променливи; предполагам вече знаеш това, ако си бил на последната лекция -
prime_divisors
става добре съсselect
-
Array.new
,Hash.new
и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е.[]
,{}
и прочее -
fizzbuzz
иdensities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
:) Тоест, не е имало нужда да имплементираш самtimes_found
, "вграденият"count
вече прави това, което ти трябва - Хешът, който връщаш на потребителя в
group_values
има особен страничен ефект и той е, че като човек поиска несъществуващ ключ, ще получи празен списък, вместоnil
; това е окей при хешове за вътрешна употреба, но не е окей за хешове, връщани на потребителя
Да, вече ги видях тия неща на лекцията. :) А за имената на променливите ще се постарая повече следващия път. :D