Решение на Първа задача от Дамяна Иванова

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

Към профила на Дамяна Иванова

Резултати

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

Код

class Integer
def prime_divisors
if self > 0
number = self
else
number = -self
end
nums = (2..number/2).to_a
prime = lambda do |x|
return true if x == 2 or x == 3
numbers = (2..Math.sqrt(x).round + 1).to_a
numbers.each {|y| return false if x % y == 0}
return true
end
nums.delete_if {|x| not prime.(x) or not number % x == 0}
return nums
end
end
class Range
def fizzbuzz
arr = self.to_a
num = 0
substitute = lambda do |x|
if x % 3 == 0 and x % 5 == 0
return :fizzbuzz
elsif x % 3 == 0
return :fizz
elsif x % 5 == 0
return :buzz
else
return false
end
end
arr.each do |x|
subs = substitute.(arr[num])
arr[num] = subs if subs
num += 1
end
return arr
end
end
class Hash
def group_values
result = Hash.new{|result, x|result[x] = []}
self.each{|key, value| result[value].push(key)}
return result
end
end
class Array
def densities
arr = self
num = 0
result = []
positions = Hash.new{|positions, x| positions[x] = []}
until num >= arr.length
positions[arr[num]].push(num)
num += 1
end
keys = positions.keys
keys.each {|key| positions[key].each {|x| result[x] = positions[key].length}}
return result
end
end

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

........

Finished in 0.00785 seconds
8 examples, 0 failures

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

Дамяна обнови решението на 14.10.2012 22:42 (преди около 12 години)

+class Integer
+ def prime_divisors
+ if self > 0
+ number = self
+ else
+ number = -self
+ end
+ nums = (2..number/2).to_a
+ prime = lambda do |x|
+ return true if x == 2 or x == 3
+ numbers = (2..Math.sqrt(x).round + 1).to_a
+ numbers.each {|y| return false if x % y == 0}
+ return true
+ end
+ nums.delete_if {|x| not prime.(x) or not number % x == 0}
+ return nums
+ end
+end
+
+
+class Range
+ def fizzbuzz
+ arr = self.to_a
+ num = 0
+ substitute = lambda do |x|
+ if x % 3 == 0 and x % 5 == 0
+ return :fizzbuzz
+ elsif x % 3 == 0
+ return :fizz
+ elsif x % 5 == 0
+ return :buzz
+ else
+ return false
+ end
+ end
+ arr.each do |x|
+ subs = substitute.(arr[num])
+ arr[num] = subs if subs
+ num += 1
+ end
+ return arr
+ end
+end
+
+
+class Hash
+ def group_values
+ result = Hash.new{|result, x|result[x] = []}
+ self.each{|key, value| result[value].push(key)}
+ return result
+ end
+end
+
+
+class Array
+ def densities
+ arr = self
+ num = 0
+ result = []
+ positions = Hash.new{|positions, x| positions[x] = []}
+ until num >= arr.length
+ positions[arr[num]].push(num)
+ num += 1
+ end
+ keys = positions.keys
+ keys.each {|key| positions[key].each {|x| result[x] = positions[key].length}}
+ return result
+ end
+end
  • За кода на ред 3 до 7 си има метод abs :)
  • Това, че ползваш lambda в prime_divisors е добре, но май щеше да стане по-четимо, ако го беше преместила в отделен метод в Integer, например prime? (както много твои колеги са направили).
  • Да мутираш списък не е много добра идея в случая (визирам delete_if). Може да го избегнеш с помощта на select. Старай се да избягваш мутиране, докато не свикнеш с map, select, reject и прочее методи от Enumerable.
  • Не спазваш съвсем конвенциите за поставяне на whitespace, по-специално около { и } в едноредови блокове; за справка виж ръководството за стил на курса
  • arr, num, substitute и подобни са лоши имена на променливи (вероятно си наясно с това, ако си присъствала на последната лекция) :)
  • fizzbuzz и densities се получават много добре с map; допълнително, densities се прави на един ред, с този код: map { |item| count item } :)
  • Хешът, който връщаш на потребителя в group_values има особен страничен ефект и той е, че като човек поиска несъществуващ ключ, ще получи празен списък, вместо nil; това е окей при хешове за вътрешна употреба, но не е окей за хешове, връщани на потребителя
  • "unbound" цикли в Ruby като while, until и прочее се ползват много рядко — например ако четеш данни по мрежа и не знаеш кога ще свършат; в случаите, в които ти ги ползваш, се предпочитат each, map, select и сродни
  • Виждам, че lambda-функциите са ти допаднали, но се надявам, че си видяла и други решения на fizzbuzz, особено това, което показахме, за да видиш как се прави обикновено в случая