Цвета обнови решението на 13.10.2012 02:54 (преди около 12 години)
+class Integer
+ def prime_divisors
+ i = 2
+ result = []
+ number = self.abs
+ while number != 1
+ if number%i == 0
+ number /= i while number%i == 0
+ result << i
+ end
+ i += 1
+ end
+ result
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = []
+ self.each do |number|
+ if number%3 == 0 and number%5 == 0
+ result << :fizzbuzz
+ elsif number%3 == 0
+ result << :fizz
+ elsif number%5 == 0
+ result << :buzz
+ else
+ result << number
+ end
+ end
+ result
+ end
+end
+
+class Hash
+ def group_values
+ keys = self.keys
+ values = self.values
+ array = []
+ result = {}
+ values.each do |item|
+ i = 0
+ next if item == nil
+ while i < values.size
+ if item == values[i]
+ array << keys[i]
+ values[i] = nil
+ end
+ i += 1
+ end
+ result[item] = array
+ array = []
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ result = []
+ temp = 0
+ self.each do |symbol|
+ i = 0
+ while i < self.size
+ temp += 1 if symbol == self[i]
+ i += 1
+ end
+ result << temp
+ temp = 0
+ end
+ result
+ end
+end
- Имена на променливи като
i
са някак си неописателни - Във
fizbuzz
си имала предвидmap
, който и без друго ще ти върне масив - В
group_values
вероятно не си искала да третираш стойностите и ключовете самостоятелно, а да направиш някакъвeach
по двойките. - По принцип, дори и извън Ruby, трябва да те притесняват повторенията. Част от тях имат начин да се избягнат (
array = []
), а други да се оформят по-прилично (array, result = [], {}
) - Нямаш нужда от
self
на много места.self.keys
в един приличен код би било напълно еквивалентно наkeys
и внася малко смут при четене - Обикновено имаш по-описателен и кратък заместител на конструкции като
while i < self.size
-count
,any?
,all?
,each
,select
и т.н. Погледни документацията наEnumerable
Още малко бележки:
-
fizzbuzz
иdensities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
- Около "оператори", например
%
, винаги се оставя по един интервал, например3 % 5 == ...
- Може би вече си разбрала от предишните ни сбирки, че
temp
е възможно най-лошото име на променлива, което можеш да избереш и че следващия път трябва да се постараеш повече над избора на имена :)
Допълнително, разгледай решенията, на които сме дали бонус точки, както и виж примерното решение, което показахме в слайдовете от предните пъти (ако не си). Ако имаш въпроси, пиши.