Дамяна обнови решението на 14.10.2012 22:42 (преди около 12 години)
+class Integer
+ def prime_divisors
+ if self > 0
+ number = self
+ else
+ number = -self
+ end
+ nums = (2..number/2).to_a
+ prime = lambda do |x|
+ return true if x == 2 or x == 3
+ numbers = (2..Math.sqrt(x).round + 1).to_a
+ numbers.each {|y| return false if x % y == 0}
+ return true
+ end
+ nums.delete_if {|x| not prime.(x) or not number % x == 0}
+ return nums
+ end
+end
+
+
+class Range
+ def fizzbuzz
+ arr = self.to_a
+ num = 0
+ substitute = lambda do |x|
+ if x % 3 == 0 and x % 5 == 0
+ return :fizzbuzz
+ elsif x % 3 == 0
+ return :fizz
+ elsif x % 5 == 0
+ return :buzz
+ else
+ return false
+ end
+ end
+ arr.each do |x|
+ subs = substitute.(arr[num])
+ arr[num] = subs if subs
+ num += 1
+ end
+ return arr
+ end
+end
+
+
+class Hash
+ def group_values
+ result = Hash.new{|result, x|result[x] = []}
+ self.each{|key, value| result[value].push(key)}
+ return result
+ end
+end
+
+
+class Array
+ def densities
+ arr = self
+ num = 0
+ result = []
+ positions = Hash.new{|positions, x| positions[x] = []}
+ until num >= arr.length
+ positions[arr[num]].push(num)
+ num += 1
+ end
+ keys = positions.keys
+ keys.each {|key| positions[key].each {|x| result[x] = positions[key].length}}
+ return result
+ end
+end
- За кода на ред 3 до 7 си има метод
abs
:) - Това, че ползваш
lambda
вprime_divisors
е добре, но май щеше да стане по-четимо, ако го беше преместила в отделен метод вInteger
, напримерprime?
(както много твои колеги са направили). - Да мутираш списък не е много добра идея в случая (визирам
delete_if
). Може да го избегнеш с помощта наselect
. Старай се да избягваш мутиране, докато не свикнеш сmap
,select
,reject
и прочее методи отEnumerable
. - Не спазваш съвсем конвенциите за поставяне на whitespace, по-специално около
{
и}
в едноредови блокове; за справка виж ръководството за стил на курса -
arr
,num
,substitute
и подобни са лоши имена на променливи (вероятно си наясно с това, ако си присъствала на последната лекция) :) -
fizzbuzz
иdensities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
:) - Хешът, който връщаш на потребителя в
group_values
има особен страничен ефект и той е, че като човек поиска несъществуващ ключ, ще получи празен списък, вместоnil
; това е окей при хешове за вътрешна употреба, но не е окей за хешове, връщани на потребителя - "unbound" цикли в Ruby като
while
,until
и прочее се ползват много рядко — например ако четеш данни по мрежа и не знаеш кога ще свършат; в случаите, в които ти ги ползваш, се предпочитатeach
,map
,select
и сродни - Виждам, че
lambda
-функциите са ти допаднали, но се надявам, че си видяла и други решения наfizzbuzz
, особено това, което показахме, за да видиш как се прави обикновено в случая
А, и self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция.