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

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

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

Резултати

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

Код

class Integer
def prime_divisors
return [] if abs <= 3
mid = abs / 2
Integer.primes_till(mid).select { |current| self % current == 0 }
end
def self.primes_till(bound)
primes = (2..bound.abs).to_a;
n = Math.sqrt(primes.length).floor
(0..n).each do |i|
break unless primes[i]
primes = primes.select { |current| current == primes[i] or current % primes[i] != 0 }
end
primes
end
end
class Range
def fizzbuzz
to_a.map do |current|
if current % 3 == 0 and current % 5 == 0
:fizzbuzz
elsif current % 3 == 0
:fizz
elsif current % 5 == 0
:buzz
else
current
end
end
end
end
class Hash
def group_values
result = Hash.new { |hash, key| hash[key] = [] }
each { |k, v| result[v].push k }
result
end
end
class Array
def densities
counters = Hash.new { |hash, key| hash[key] = 0 }
each { |current| counters[current] += 1 }
map { |current| counters[current] }
end
end

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

........

Finished in 0.0078 seconds
8 examples, 0 failures

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

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

+class Integer
+ def prime_divisors
+ return [] if self.abs <= 3
+
+ mid = self.abs / 2
+ primes = (2..mid).to_a;
+
+ n = Math.sqrt(primes.length).floor
+ (0..n).each do |i|
+ break unless primes[i]
+ primes = primes.find_all { |curr| curr == primes[i] or curr % primes[i] != 0 }
+ end
+
+ primes.find_all { |curr| self % curr == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.map do |curr|
+ if curr % 3 == 0 and curr % 5 == 0
+ :fizzbuzz
+ elsif curr % 3 == 0
+ :fizz
+ elsif curr % 5 == 0
+ :buzz
+ else
+ curr
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ h = Hash.new { |hash, key| hash[key] = [] }
+ self.each { |k, v| h[v].push k }
+ h
+ end
+end
+
+class Array
+ def densities
+ counters = Hash.new { |hash, key| hash[key] = 0 }
+
+ self.each { |curr| counters[curr] += 1 }
+
+ self.map { |curr| counters[curr] }
+ end
+end
  • curr и h са лоши имена на променливи. Нищо няма да ти стане, ако ги кръстиш current и hash (или result).
  • self.-а на всичките места на които го ползваш е излишен.
  • a % 3 == 0 and a % 5 == 0 има по-прост запис :)
  • Ползвай select вместо find_all - никой не ползва последното.
  • В prime_divisors всякаш си просиш за допълнителен метод. Ако не ти се monkey patch-ва integer-а още веднъж, можеш да си направиш ламбда.

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

class Integer
def prime_divisors
- return [] if self.abs <= 3
+ return [] if abs <= 3
- mid = self.abs / 2
- primes = (2..mid).to_a;
+ mid = abs / 2
+
+ mid.bound_primes.select { |current| self % current == 0 }
+ end
+
+ def bound_primes
+ primes = (2..abs).to_a;
n = Math.sqrt(primes.length).floor
(0..n).each do |i|
break unless primes[i]
- primes = primes.find_all { |curr| curr == primes[i] or curr % primes[i] != 0 }
+ primes = primes.select { |current| current == primes[i] or current % primes[i] != 0 }
end
-
- primes.find_all { |curr| self % curr == 0 }
+
+ primes
end
end
class Range
def fizzbuzz
- self.to_a.map do |curr|
- if curr % 3 == 0 and curr % 5 == 0
+ to_a.map do |current|
+ if current % 3 == 0 and current % 5 == 0
:fizzbuzz
- elsif curr % 3 == 0
+ elsif current % 3 == 0
:fizz
- elsif curr % 5 == 0
+ elsif current % 5 == 0
:buzz
else
- curr
+ current
end
end
end
end
class Hash
def group_values
- h = Hash.new { |hash, key| hash[key] = [] }
- self.each { |k, v| h[v].push k }
- h
+ result = Hash.new { |hash, key| hash[key] = [] }
+ each { |k, v| result[v].push k }
+ result
end
end
class Array
def densities
counters = Hash.new { |hash, key| hash[key] = 0 }
- self.each { |curr| counters[curr] += 1 }
+ each { |current| counters[current] += 1 }
- self.map { |curr| counters[curr] }
+ map { |current| counters[current] }
end
end

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

+
class Integer
def prime_divisors
return [] if abs <= 3
mid = abs / 2
- mid.bound_primes.select { |current| self % current == 0 }
+ Integer.primes_till(mid).select { |current| self % current == 0 }
end
- def bound_primes
- primes = (2..abs).to_a;
+ def self.primes_till(bound)
+ primes = (2..bound.abs).to_a;
n = Math.sqrt(primes.length).floor
(0..n).each do |i|
break unless primes[i]
primes = primes.select { |current| current == primes[i] or current % primes[i] != 0 }
end
primes
end
end
class Range
def fizzbuzz
to_a.map do |current|
if current % 3 == 0 and current % 5 == 0
:fizzbuzz
elsif current % 3 == 0
:fizz
elsif current % 5 == 0
:buzz
else
current
end
end
end
end
class Hash
def group_values
result = Hash.new { |hash, key| hash[key] = [] }
each { |k, v| result[v].push k }
result
end
end
class Array
def densities
counters = Hash.new { |hash, key| hash[key] = 0 }
each { |current| counters[current] += 1 }
map { |current| counters[current] }
end
end