Йоана обнови решението на 14.10.2012 22:45 (преди около 12 години)
+def prime_num?(num)
+ i, count = 2, 0
+ while i<=Math.sqrt(num) do
+ count+=1 if num%i==0
+ i+=1
+ end
+ count==0
+end
+
+class Integer
+ def prime_divisors
+ divisors, i = [], 2
+ while i<=self/2.0
+ divisors.push(i) if prime_num?(i) and self%i==0
+ i+=1
+ end
+ divisors.push(self) if prime_num?(self)
+ divisors
+ end
+end
+
+class Range
+ def fizzbuzz
+ array = []
+ self.each do |e|
+ case
+ when e%3==0
+ array.push(:fizz)
+ when e%5==0
+ array.push(:buzz)
+ when (e%5==0 and e%3==0)
+ array.push(:fizzbuzz)
+ else
+ array.push(e)
+ end
+
+ end
+ array
+ end
+end
+
+class Hash
+ def group_values
+ hash_rev = Hash.new
+ flag=false
+ for key, value in self
+ if hash_rev.empty?
+ hash_rev[value] = [key]
+ else
+ hash_rev.each do |key_rev,value_rev|
+ if value==key_rev
+ value_rev.push(key)
+ flag=true
+ end
+ end
+ hash_rev[value] = [key] if flag==false
+ end
+ end
+ hash_rev
+ end
+end
+
+class Array
+ def densities
+ array_copy = []
+ self.each {|e| array_copy.push(e)}
+ i=0
+ while (i<array_copy.count)
+ array_copy[i]=self.count(array_copy[i])
+ i+=1
+
+ end
+ array_copy
+ end
+end
Коментари:
- Грубо не спазваш конвенциите. Ruby код не се идентира така, интервали се поставят на няколко места, на които не си поставила, ползваш
for
въпреки изричното "не го правете" на лекции. - Имаш monkey patch върху
Object
с тозиprime_num?
. Това е неприемливо. - Това не е Ruby код, а Java/C код в кожата на Ruby. Има един тон възможности да ползваш функционални идиоми, които си изпуснала.
- Добре е да ползваш
while
цикъл само и единствено, когато не знаеш колкто итерации е нужно да бъдат направени. В твоята програма няма нужда отwhile
цикли. - Не се пише
Hash.new
, а{}
. - Въобще, има ред Ruby идиоми, които сме показали, но не прилагаш.
map
,select
иall?
например.