Решение на Първа задача от Кристиян Азманов

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

Към профила на Кристиян Азманов

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 12 успешни тест(а)
  • 2 неуспешни тест(а)

Код

class Integer
def prime?
(return nil) if(self<=0)
(2..(self - 1)).each do |d|
(return false) if (self % d) == 0
end
true
end
def prime_factors
tmp= if (self<0) then (tmp=(-1)*(self)) else (self) end
(return []) if (self==0 or self==1)
tmp.downto(2) do |number|
if(tmp%number == 0 and number.prime?)
tmp = tmp/number
return (tmp.prime_factors)<<number
end
end
end
def harmonic
unless (self<=0)
sum = Rational(1,1)
(2..self).each do |current|
sum+=Rational(1,current) end
return sum
end
end
def digits
result = []
tmp = if(self<0) then ((-1)*self) else (self) end
while (tmp/10 != 0) do result<<tmp%10
tmp/=10 end
result<<tmp
return result.reverse
end
end
class Array
def frequencies
hashResult = {}
self.each do |el|
if(hashResult[el]==nil) then hashResult[el]=1 else hashResult[el]+=1 end
end
return hashResult
end
def average
sum = 0.0
counter =0
self.each do |element|
counter+=1
sum+=element
end
return sum/counter
end
def drop_every(n)
resultArray = []
counter=1
self.each do |element|
resultArray<<element unless (counter%n==0)
counter+=1
end
return resultArray
end
def combine_with(other)
result = []
counter = 0
maxLength = if (self.size>=other.size) then self.size else other.size end
(0..maxLength).each do |index| result<<self[index] if(self[index]!=nil)
result<<other[index] if(other[index]!=nil)
end
return result
end
end

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

F...........F.

Failures:

  1) Integer#prime? checks if a number is prime
     Failure/Error: -13.prime?.should eq false
       
       expected: false
            got: nil
       
       (compared using ==)
     # /tmp/d20131023-4395-14tgw0w/spec.rb:3:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Array#combine_with combines two arrays by alternatingly taking elements
     Failure/Error: [:a, :b, :c].combine_with([1, nil, 3]).should       eq [:a, 1, :b, nil, :c, 3]
       
       expected: [:a, 1, :b, nil, :c, 3]
            got: [:a, 1, :b, :c, 3]
       
       (compared using ==)
     # /tmp/d20131023-4395-14tgw0w/spec.rb:110:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.0219 seconds
14 examples, 2 failures

Failed examples:

rspec /tmp/d20131023-4395-14tgw0w/spec.rb:2 # Integer#prime? checks if a number is prime
rspec /tmp/d20131023-4395-14tgw0w/spec.rb:103 # Array#combine_with combines two arrays by alternatingly taking elements

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

Кристиян обнови решението на 13.10.2013 19:16 (преди около 11 години)

+class Integer
+ def prime?
+ (return nil) if(self<=0)
+ (2..(self - 1)).each do |d|
+ (return false) if (self % d) == 0
+ end
+ true
+ end
+ def prime_factors
+ tmp= if (self<0) then (tmp=(-1)*(self)) else (self) end
+ (return []) if (self==0 or self==1)
+ tmp.downto(2) do |number|
+ if(tmp%number == 0 and number.prime?)
+ tmp = tmp/number
+ return (tmp.prime_factors)<<number
+ end
+ end
+ end
+ def harmonic
+ unless (self<=0)
+ sum = Rational(1,1)
+ (2..self).each do |current|
+ sum+=Rational(1,current) end
+ return sum
+ end
+ end
+ def digits
+ result = []
+ tmp = if(self<0) then ((-1)*self) else (self) end
+ while (tmp/10 != 0) do result<<tmp%10
+ tmp/=10 end
+ result<<tmp
+ return result.reverse
+ end
+end
+
+class Array
+ def frequencies
+ hashResult = {}
+ self.each do |el|
+ if(hashResult[el]==nil) then hashResult[el]=1 else hashResult[el]+=1 end
+ end
+ return hashResult
+ end
+ def average
+ sum = 0.0
+ counter =0
+ self.each do |element|
+ counter+=1
+ sum+=element
+ end
+ return sum/counter
+ end
+ def drop_every(n)
+ resultArray = []
+ counter=1
+ self.each do |element|
+ resultArray<<element unless (counter%n==0)
+ counter+=1
+ end
+ return resultArray
+ end
+ def combine_with(other)
+ result = []
+ counter = 0
+ maxLength = if (self.size>=other.size) then self.size else other.size end
+ (0..maxLength).each do |index| result<<self[index] if(self[index]!=nil)
+ result<<other[index] if(other[index]!=nil)
+ end
+ return result
+ end
+end

Малко бележки:

  • Имаш проблеми със спазването на конвенциите; консултирай се с ръководството по стил; трябва да има по един празен ред между всяка дефиниция на метод; трябва да има интервали около оператори като =, /, % и др.; не трявба да кръщаваш променливи с camelCase, трябва да са snake_case и т.н.
  • Имена като hashResult, resultArray, counter, result, d, tmp са лоши (особено tmp, което си ползвал неведнъж); съкращавайки няколко символа, не печелиш нищо, а губиш много; стреми се да спазваш clarity over brevity
  • На много места си слагал скоби, които са излишни; 95% от скобите ти са излишни; например, на ред 3 и ред 5 не трябва да има никакви скоби; на ред 4, нещата могат да се запишат така: (2..self - 1).each, или дори (2..pred).each; може и така: (2...self).each
  • Ред 10 - за това, което правиш тук, си има метод, потърси го; иначе, не ползвай if/then/else, ползвай тернарният оператор foo ? bar : baz; аз бих го записал така: positive_number = self > 0 ? self : -self
  • Ред 11 трябва да е преди ред 10 и се записва без никакви скоби
  • За много от нещата, които правиш, си има вградена функционалност; вярно е, че не сме говорили за това все още, но преди да тръгнеш да имплементираш нещо сам, винаги е добра идея да провериш дали го няма готово вече (в случая, в ruby-core или ruby-stdlib)

Моля те, подреди си малко решението, изчисти тези проблеми и пусни един коментар тук, тогава ще ти дам още бележки.

ФорматиранетоПодредбата се запазва при copy/paste. Ако имаш някакъв проблем с това, най-вероятно не си го идентирал правилно (с по два интервала). Освен това, не мога да разбера какво значи "накъсано". Снимка на екран ще ми помогне.

class Integer

def prime?
return nil if self <= 0
    (2..pred).each do |integer_divisor|
        return false if self % integer_divisor == 0
    end
    true
end

def prime_factors
return [] if self == 0 or self == 1
observed_int = self < 0 ? - self : self
    observed_int.downto(2) do |divisor|
            if observed_int % divisor == 0 and divisor.prime?
            observed_int = observed_int / divisor
            return observed_int.prime_factors<<divisor
        end
    end
end

def harmonic
    unless self <= 0
    sum_result = Rational(1,1)
        (2..self).each do |current_digit|
        sum_result += Rational(1,current_digit) end
    return sum_result
    end
end

def digits
    digits_result_array = []
    observed = self < 0 ? - self : self
        while observed / 10 != 0 do digits_result_array<<observed % 10
                                    observed /= 10 end
                                    digits_result_array<<observed
    return digits_result_array.reverse
end

end


class Array
def frequencies
    hash_result = {}
    self.each do |occurence|
        if(hash_result[occurence] == nil) then hash_result[occurence] = 1
        else hash_result[occurence] += 1 end
    end
    return hash_result
end

def average
    members_sum = elements_counter = 0.0
    self.each do |current_element|
        elements_counter += 1
        members_sum += current_element
    end
    return members_sum / elements_counter
end

def drop_every(n)
    array_with_dropped_values = []
    counter = 1
    self.each do |element|
        array_with_dropped_values<<element unless (counter % n == 0)
        counter += 1
    end
    return array_with_dropped_values
end

def combine_with(other)
    combined_arr = []
    counter = 0
    max_len = self.size >= other.size ? self.size : other.size
    (0..max_len).each do |index| combined_arr<<self[index] if(self[index] != nil)
                                 combined_arr<<other[index] if(other[index] != nil)
    end
    return combined_arr
end
end