Кристиян обнови решението на 13.10.2013 19:16 (преди около 11 години)
Малко бележки:
- Имаш проблеми със спазването на конвенциите; консултирай се с ръководството по стил; трябва да има по един празен ред между всяка дефиниция на метод; трябва да има интервали около оператори като
=
,/
,%
и др.; не трявба да кръщаваш променливи с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 от Notepad++.
ФорматиранетоПодредбата се запазва при 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
Това, което пействаш, е идентирано с табове. Оправи си идентацията.
Виж тук за повече информация – http://2012.fmi.ruby.bg/topics/231
Така дали е ОК?
Мога ли да видя кои са 2та неуспешни теста, на които кодът не е сработил?
Кристиян, би трябвало да виждаш лога вече. Аз го виждам и като гост, под заглавието "Лог от изпълнението".
Да, видях го, извинявам се.