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

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

Към профила на Красимир Георгиев

Резултати

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

Код

# crazy.rb - hw#1 solutions
# by comco
class Integer
def prime_divisors
a = []
(2..abs).each { |e| a << e if (abs % e == 0) and a.all? { |f| e % f != 0 } }
a
end
end
class Range
def fizzbuzz
map do |e|
x = :fizz if e % 3 == 0
x = "#{x}buzz".to_sym if e % 5 == 0
x ||= e
end
end
end
class Hash
def group_values
h = {}
each { |k, v| (h[v] ||= []) << k }
h
end
end
class Array
def densities
map { |e| self.count e }
end
end

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

........

Finished in 0.01191 seconds
8 examples, 0 failures

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

Красимир обнови решението на 11.10.2012 11:02 (преди около 12 години)

+# crazy.rb - hw#1 solutions
+# by comco
+
+class Integer
+ def prime_divisors
+ a = []
+ (2..abs).each { |e| a << e if (abs % e == 0) and a.all? { |f| e % f != 0 } }
+ a
+ end
+end
+
+class Range
+ def fizzbuzz
+ map do |e|
+ x = :fizz if e % 3 == 0
+ x = "#{x}buzz".to_sym if e % 5 == 0
+ x ||= e
+ end
+ end
+end
+
+class Hash
+ def group_values
+ h = {}
+ each { |k, v| (h[v] ||= []) << k }
+ h
+ end
+end
+
+class Array
+ def densities
+ map { |e| self.count e }
+ end
+end
  • Слагай малко повече нови редове, така кодът ще стане по-четим. Особено седми ред е...
  • Имена на променливи от типа a, e, f, x и подобни, особено на един ред, е лош стил. Измисли им хубави, смислени имена. Макар и по-дълги, ще стане много по-ясно какво се случва.
  • hash е по-добро име от h. grouped_values, grouped (или сродни) е по-добре от hash. И така...

Иначе нещата изглеждат добре. Занимавал ли си се с Ruby преди курса? :)

За това с имената съм съгласен - то е валидно за всички езици. Просто не можах да устоя да напиша първата част като one-liner :) (седми ред е точно 80 символа - бях го докарал до към 70, ама беше грозно...), а оттам нататък, за консистентност... :) Специално за a и e прочетох в style-guide-а (accumulator / element) - семантично ги използвам като такива, въпреки че не и с reduce.

Това за a и e е едно от нещата, които не подкрепяме в този style guide и трябва да бъде променено :)

Тематично: http://37signals.com/svn/posts/3250-clarity-over-brevity-in-variable-and-method-names

Позволено ти е да пробваш веднъж как стават нещата на един ред, но го избягвай като принцип :)

  • Ако имаш толкова сложен each като този в prime_divisor, направи го на няколко реда.
  • fizzbuzz-а ти е сложен. Вместо да конструираш низове, далеч по просто е да имаш условие с четири разклонения.
  • Допълнително, това че x е nil там е твърде магическо, за да очакваш някой да го разбере.
  • (h[v] ||= []) << k е супер гадно. По-добре го направи на два реда.
  • self. е излишно.

Иначе, браво че си го направил толкова кратко. Щях да ти дам бонус точки, ако (1) беше оправил имената и (2) кода ти беше по-ясен. Оптимизирал си за компактност една идея повече, отколкото трябва.