Решение на Първа задача от Христо Владев

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

Към профила на Христо Владев

Резултати

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

Код

# Not sure about the proper scope for this helper method... Hope its not a problem at this time.
# Finds all the prime numbers less than or equal to a given integer n by Eratosthenes' method.
def find_primes(n)
n = n.abs
sieve = (0..n).to_a
sieve[0] = sieve[1] = nil
sieve.each do |k|
next unless k
break if k * k > n
(k * k).step(n, k) { |p| sieve[p] = nil }
end
sieve.compact
end
class Integer
def prime_divisors
divisors = find_primes self
divisors.delete_if { |v| self % v != 0 }
end
end
class Range
def fizzbuzz
result = []
self.each do |k|
if k % 3 == 0 && k % 5 == 0
result.push(:fizzbuzz)
elsif k % 3 == 0
result.push(:fizz)
elsif k % 5 == 0
result.push(:buzz)
else
result.push(k)
end
end
result
end
end
class Hash
def group_values
grouped = {}
values = self.values.uniq
values.each do |n|
grouped[n] = self.select { |_, v| v == n }.keys
end
grouped
end
end
class Array
def densities
count = Hash.new(0)
result = []
self.each { |v| count[v] += 1 }
self.each { |v| result.push(count[v]) }
result
end
end

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

........

Finished in 0.00728 seconds
8 examples, 0 failures

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

Христо обнови решението на 15.10.2012 15:56 (преди около 12 години)

+# Not sure about the proper scope for this helper method... Hope its not a problem at this time.
+# Finds all the prime numbers less than or equal to a given integer n by Eratosthenes' method.
+def find_primes(n)
+ n = n.abs
+ sieve = (0..n).to_a
+
+ sieve[0] = sieve[1] = nil
+
+ sieve.each do |k|
+ next unless k
+ break if k * k > n
+ (k * k).step(n, k) { |p| sieve[p] = nil }
+ end
+
+ sieve.compact
+end
+
+class Integer
+ def prime_divisors
+ divisors = find_primes self
+
+ divisors.delete_if { |v| self % v != 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = []
+
+ self.each do |k|
+ if k % 3 == 0 && k % 5 == 0
+ result.push(:fizzbuzz)
+ elsif k % 3 == 0
+ result.push(:fizz)
+ elsif k % 5 == 0
+ result.push(:buzz)
+ else
+ result.push(k)
+ end
+ end
+
+ result
+ end
+end
+
+class Hash
+ def group_values
+ grouped = {}
+ values = self.values.uniq
+
+ values.each do |n|
+ grouped[n] = self.select { |_, v| v == n }.keys
+ end
+
+ grouped
+ end
+end
+
+class Array
+ def densities
+ count = Hash.new(0)
+ result = []
+
+ self.each { |v| count[v] += 1 }
+ self.each { |v| result.push(count[v]) }
+
+ result
+ end
+end

Принципно "глобалните" методи трябва да се избягват. Те отиват като private в Object. По-добре е или да си направиш едно малко класче, което да капсулира въпросния алгоритъм, или, в краен случай, да го бутнеш като още един метод в Integer. Засега, понеже още не сме говорили в детайли за това как се прави клас и метод, не го изискваме от вас, но ако си достатъчно любознателен, може би ще се оправиш и сам :)

Ами аз първо го бях сложил в един клас Helpers(или нещо такова), но помислих че е глупаво(един клас с един метод self.find_primes) и го оставих така както е в момента. Предположих, че ще стане нещо както в JS(всичко отива в window обекта) и ако е нужно ще го променя, ако е възможно след като е минал срока.

Надявам се, че си разгледал примерното ни решение и че си видял решенията, на които сме дали бонус точки. Те ще ти дадат интересни идеи как биха могли да се напишат повечето такива конструкции в Руби.

Ако имаш някакви въпроси, питай, ако не — следващия път още по-добре :)

Да, разгледах почти всички решения и видях че съм пропуснал Руби методи, които да ползвам готино и елегантно за решението.

Въпроси нямам, тъй че чакам следващото домашно, с което много се бавите, а пръстите ме сърбят вече... (: