Решение на Първа задача от Александър Иванов

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

Към профила на Александър Иванов

Резултати

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

Код

class Range
def fizzbuzz
map do |val|
data = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
data == '' ? val : data.to_sym
end
end
end
class Hash
def group_values
each_with_object({}) do |(key, val), memo|
memo[val] ? memo[val] << key : memo[val] = [key]
end
end
end
class Array
def densities
map {|val| count val}
end
end
class Integer
def prime_divisors
(2..abs).each_with_object([]) do |val, divisors|
divisors << val if abs % val == 0 &&
divisors.all? {|div| val % div != 0}
end
end
end

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

........

Finished in 0.0073 seconds
8 examples, 0 failures

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

Александър обнови решението на 13.10.2012 11:38 (преди около 12 години)

+
+
+class Range
+ def fizzbuzz
+ self.each.map{|val|
+ a = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
+ a == '' ? val : a.to_sym
+ }
+ end
+end
+
+class Hash
+ def group_values
+ self.each_with_object({}) {|key, nha|
+ key, val = key
+ nha[val] ? nha[val] << key : nha[val] = [key]
+ }
+ end
+end
+
+
+
+class Array
+ def densities
+ self.map{|val| self.count val}
+ end
+end
+
+
+
+
+
+
+
+
+class Integer
+
+ private
+ def prime?(candidate)
+ (2..(candidate ** 0.5).ceil + 1).each{|num|
+ return false if candidate % num == 0 and candidate > num
+ }
+ true
+ end
+
+ public
+
+ def prime_divisors
+ (2..self.abs).each.select{|val| self.abs % val == 0 and self.prime? val}
+ end
+end
+
+
+
+
+
+
+
+
+
+

Александър обнови решението на 13.10.2012 21:00 (преди около 12 години)

class Range
- def fizzbuzz
- self.each.map{|val|
- a = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
- a == '' ? val : a.to_sym
- }
- end
+ def fizzbuzz
+ self.each.map do |val|
+ a = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
+ a == '' ? val : a.to_sym
+ end
+ end
end
class Hash
- def group_values
- self.each_with_object({}) {|key, nha|
- key, val = key
- nha[val] ? nha[val] << key : nha[val] = [key]
- }
- end
+ def group_values
+ self.each_with_object({}) do |key, nha|
+ key, val = key
+ nha[val] ? nha[val] << key : nha[val] = [key]
+ end
+ end
end
-
+
-
class Array
- def densities
- self.map{|val| self.count val}
- end
+ def densities
+ self.map {|val| self.count val}
+ end
end
class Integer
- private
- def prime?(candidate)
- (2..(candidate ** 0.5).ceil + 1).each{|num|
- return false if candidate % num == 0 and candidate > num
- }
- true
- end
- public
-
def prime_divisors
- (2..self.abs).each.select{|val| self.abs % val == 0 and self.prime? val}
+ (2..self.abs).inject([]) do |divisors, val|
+ divisors.push val if self.abs % val == 0 &&
+ divisors.all? {|div| val % div != 0}
+
+ divisors
+ end
end
end
+
-
-
+
-
-
-

Александър обнови решението на 14.10.2012 19:28 (преди около 12 години)

-
-
class Range
def fizzbuzz
- self.each.map do |val|
- a = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
- a == '' ? val : a.to_sym
+ self.map do |val|
+ e = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
+ e == '' ? val : e.to_sym
end
end
end
+
class Hash
def group_values
- self.each_with_object({}) do |key, nha|
+ self.each_with_object({}) do |key, dict|
key, val = key
- nha[val] ? nha[val] << key : nha[val] = [key]
+ dict[val] ? dict[val] << key : dict[val] = [key]
end
end
end
class Array
def densities
self.map {|val| self.count val}
end
end
-
-
-
-
class Integer
-
-
def prime_divisors
(2..self.abs).inject([]) do |divisors, val|
divisors.push val if self.abs % val == 0 &&
divisors.all? {|div| val % div != 0}
divisors
end
end
end
-
-
+
+
+
+
+
+
+

Александър обнови решението на 14.10.2012 19:29 (преди около 12 години)

class Range
def fizzbuzz
self.map do |val|
e = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
e == '' ? val : e.to_sym
end
end
end
class Hash
def group_values
self.each_with_object({}) do |key, dict|
key, val = key
dict[val] ? dict[val] << key : dict[val] = [key]
end
end
end
class Array
def densities
self.map {|val| self.count val}
end
end
class Integer
def prime_divisors
(2..self.abs).inject([]) do |divisors, val|
divisors.push val if self.abs % val == 0 &&
divisors.all? {|div| val % div != 0}
divisors
end
end
end
-
-
-
-
-
-
-
-
-
-
-
-

Александър обнови решението на 14.10.2012 23:44 (преди около 12 години)

class Range
def fizzbuzz
self.map do |val|
e = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
e == '' ? val : e.to_sym
end
end
end
class Hash
def group_values
- self.each_with_object({}) do |key, dict|
- key, val = key
+ self.each_with_object({}) do |(key, val), dict|
dict[val] ? dict[val] << key : dict[val] = [key]
end
end
end
-
+
class Array
def densities
self.map {|val| self.count val}
end
end
-
class Integer
def prime_divisors
- (2..self.abs).inject([]) do |divisors, val|
- divisors.push val if self.abs % val == 0 &&
+ (2..self.abs).each_with_object([]) do |val, divisors|
+ divisors << val if self.abs % val == 0 &&
divisors.all? {|div| val % div != 0}
-
- divisors
- end
+ end
end
end

Александър обнови решението на 15.10.2012 16:53 (преди около 12 години)

class Range
- def fizzbuzz
- self.map do |val|
- e = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
- e == '' ? val : e.to_sym
- end
+ def fizzbuzz
+ map do |val|
+ data = (val % 3 == 0 ? 'fizz' : '') + (val % 5 == 0 ? 'buzz' : '')
+ data == '' ? val : data.to_sym
end
+ end
end
-
class Hash
- def group_values
- self.each_with_object({}) do |(key, val), dict|
- dict[val] ? dict[val] << key : dict[val] = [key]
- end
+ def group_values
+ each_with_object({}) do |(key, val), memo|
+ memo[val] ? memo[val] << key : memo[val] = [key]
end
+ end
end
-
class Array
- def densities
- self.map {|val| self.count val}
- end
+ def densities
+ map {|val| count val}
+ end
end
-
-
class Integer
- def prime_divisors
- (2..self.abs).each_with_object([]) do |val, divisors|
- divisors << val if self.abs % val == 0 &&
- divisors.all? {|div| val % div != 0}
- end
- end
+ def prime_divisors
+ (2..abs).each_with_object([]) do |val, divisors|
+ divisors << val if abs % val == 0 &&
+ divisors.all? {|div| val % div != 0}
+ end
+ end
end
  • Каквото Иван каза - memo[val] ? memo[val] << key : memo[val] = [key] е просто "сладък" начин да напишеш нещо, което трябва да бъде на няколко реда. Можеш да пробваш и с: memo[val] ||= [] memo[val] << key Отделно, memo е лошо име за това, което правиш.
  • Интервали от вътрешната страна на фигурните скоби когато подаваш блог. map { |val| count val }
  • Пише се value, а не val. Нищо не печелиш с кратки имена, освен объркване.
  • Следния израз се чете трудно: divisors << val if abs % val == 0 && divisors.all? {|div| val % div != 0} Ако if-а ти не е на един ред, не ползвай постфиксен запис
  • Начина по който конструираш fizzbuzz е просто сладък. Ако искаш да е четим, по-добре е да имаш условие с четири клона.

Съгласен съм, но if ... elsif ... не е ли някак тромав запис в сравнение с примерно ({1 => value, 3 => :fizz, 5 => :buzz, 15 => :fizzbuzz})[value.gcd 15]

което също реализира условие с четири клона в по-декларативен стил (disclaimer: имаше подобно решение някъде сред домашните).

Не, if/elsif е по-добре, защото е доста по-четимо и по-очевидно. Наистина, кода е повече, но за сметка на това е кристално ясен. Няма НОД-ове, няма хешове, няма какво да мислиш за случая с 1. Просто ясно и четимо.

Има в случаи, в които малко повече, но по-ясен код е по-добре.