Решение на Първа задача от Николай Димитров

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

Към профила на Николай Димитров

Резултати

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

Код

class Integer
def prime_divisors
def prime?
return false if self < 2
(2..(self / 2)).each do |i|
return false if self.remainder(i) == 0
end
true
end
return (-self).prime_divisors if self < 0
(1..self).select { |n| n.prime? and self.remainder(n) == 0 }
end
end
class Range
def fizzbuzz
map do |n|
if n.remainder(3) == 0
n.remainder(5) == 0 ? :fizzbuzz : :fizz
else
n.remainder(5) == 0 ? :buzz : n
end
end
end
end
class Hash
def group_values
v = values.uniq.map do |val|
[val, keys.select { |key| self[key] == val } ]
end
Hash[v]
end
end
class Array
def densities
map { |elem| select { |x| x == elem }.size}
end
end

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

........

Finished in 0.00895 seconds
8 examples, 0 failures

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

Николай обнови решението на 13.10.2012 00:13 (преди около 12 години)

+class Integer
+ def prime_divisors
+ def prime?
+ return false if self < 2
+ (2..(self / 2)).each do |i|
+ return false if self.remainder(i) == 0
+ end
+ true
+ end
+ return (-self).prime_divisors if self < 0
+ (1..self).select { |n| n.prime? and self.remainder(n) == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ map do |n|
+ if n.remainder(3) == 0
+ n.remainder(5) == 0 ? :fizzbuzz : :fizz
+ else
+ n.remainder(5) == 0 ? :buzz : n
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ v = values.uniq.map do |val|
+ [val, keys.select { |key| self[key] == val } ]
+ end
+ Hash[v]
+ end
+end
+
+class Array
+ def densities
+ map { |elem| select { |x| x == elem }.size}
+ end
+end
  • Не знам как идентираш, но определено не е със интервали. Това ти струва една точка.
  • Дефинирането на един метод в друг е тъпа идея, понеже не прави каквото си мислиш.
  • Бих оставил още коментари, но разместения ти код ме отказва. Съветвам те да разгледаш други решения.

Изпревариха ме, но все пак :

Като цяло return ще ти се налага да ползваш сравнително рядко. Обикновено имаш начин да заобиколиш, като например

(2..(self / 2)).all? do |number| remainder(number).zero?

или (1..self.abs).select { |number| number.prime? and self.remainder(number) == 0 } * select { |x| x == elem }.size е малко дълъг начин да пишеш count value (http://www.ted.com/talks/terry_moore_why_is_x_the_unknown.html :) )

@Стефан Идентирането ми е точно с интервали, както пише в гайда, или поне съм се старал да е така, макар кодът да не изглежда пригледно, както беше в текстовия ми редактор. Грешката ми е, че не съм се сетил (тъпа глава) да проверя четимостта след като paste-нах кода си в сайта. Дефинирането на метод в друг съм го заимствал от Scheme, явно ще трябва да си преосмисля гледната точка.

Проблема с дефинирането на метода е, че не работи така както очакваш. Вложения define се изпълнява всеки път, когато се изпълни външния. Това което прави, е да дефинира метод върху същия клас. Демек, след като изпълниш prime_divisors върху число, всички Integer-и ще имат метод prime?.

Метода не е локален, което е половината причина да го правиш така в Scheme. Другата половин причина е, че имаш closure - променливите на външната функция се виждат във вътрешната. Което също не е вярно за Ruby.

С други думи, взел си идиом от Scheme и си го приложил във Ruby без да се замислиш дали наистина е приложим. Не се заяждам. Просто изтъквам, че това е ужасно грешен начин на мислене и трябва да му обърнеш внимание :)