Решение на Първа задача от Цвета Гергичанова

Обратно към всички решения

Към профила на Цвета Гергичанова

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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

Лог от изпълнението

........

Finished in 0.00885 seconds
8 examples, 0 failures

История (1 версия и 2 коментара)

Цвета обнови решението на 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 е възможно най-лошото име на променлива, което можеш да избереш и че следващия път трябва да се постараеш повече над избора на имена :)

Допълнително, разгледай решенията, на които сме дали бонус точки, както и виж примерното решение, което показахме в слайдовете от предните пъти (ако не си). Ако имаш въпроси, пиши.