Решение на Първа задача от Николай Колев

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

Към профила на Николай Колев

Резултати

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

Код

class Integer
def prime?
return false if self <= 1
(2...self).each { |i| return false if self % i == 0 }
true
end
def prime_factors
factors, a, i = [], abs, 2
if i.prime? and a % i == 0
factors << i
a, i = a / i, 2
else i += 1
end while a > 1 or return factors.sort #I know it is ugly
end
def harmonic
(0..self).reduce { |sum, i| sum + Rational( 1, i) }
end
def digits
abs.to_s.split(//).collect { |letter| Integer(letter) }
end
end
class Array
def frequencies
distribution = {}
each do |e|
distribution[e] == nil ? distribution[e] = 1 : distribution[e] += 1
end
distribution
end
def average
reduce(:+) / Float(length)
end
def drop_every(n)
i = 0
find_all { |e| (i+=1) % n != 0 }
end
def combine_with(other)
combo, i = [], 0
while i < [self.length, other.length].max #I know it C-like
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
end

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

..............

Finished in 0.01954 seconds
14 examples, 0 failures

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

Николай обнови решението на 11.10.2013 02:43 (преди около 11 години)

+class Integer
+ def prime?
+ return false if self <= 1
+
+ (2...self).each { |i| return false if (self % i) == 0 }
+ true
+ end
+
+ def prime_factors
+ factors, a, i = Array.new, abs, 2
+
+ while a > 1 or return factors.sort
+ if i.prime? and a % i == 0
+ factors << i and a /= i and i = 2 # workaround requirements
+ else i += 1
+ end
+ end
+ end
+
+ def harmonic
+ return nil if self < 1
+
+ sum = Rational(0)
+ (1..self).each { |i| sum += Rational(1,i) }
+ sum
+ end
+
+ def digits
+ digit = Array.new
+ n = abs
+
+ while n > 9
+ digit << n % 10
+ n/=10
+ end
+
+ (digit << n).reverse
+ end
+end
+
+class Array
+ def frequencies
+ freq = Hash.new
+ each { |e| freq[e] == nil ? freq[e] = 1 : freq[e] += 1 }
+ freq
+ end
+
+ def average
+ Rational(reduce(:+), length) unless length == 0
+ end
+
+ def drop_every(n)
+ i = 0
+ find_all { |e| (i+=1) % n != 0 } unless length == 0
+ end
+
+ def combine_with(other)
+ combo,i = Array.new,0
+
+ while i < [self.length, other.length].max # self used for clarity
+ combo << self[i] if i < self.length
+ combo << other[i] if i < other.length
+ i += 1
+ end
+ combo
+ end
+end

Николай обнови решението на 11.10.2013 02:55 (преди около 11 години)

class Integer
+
def prime?
return false if self <= 1
(2...self).each { |i| return false if (self % i) == 0 }
true
end
def prime_factors
factors, a, i = Array.new, abs, 2
- while a > 1 or return factors.sort
- if i.prime? and a % i == 0
- factors << i and a /= i and i = 2 # workaround requirements
- else i += 1
- end
- end
+ if i.prime? and a % i == 0
+ factors << i
+ a, i = a / i, 2
+ else i += 1
+ end while a > 1 or return factors.sort
end
def harmonic
return nil if self < 1
sum = Rational(0)
(1..self).each { |i| sum += Rational(1,i) }
sum
end
def digits
digit = Array.new
n = abs
while n > 9
digit << n % 10
n/=10
end
(digit << n).reverse
end
end
class Array
def frequencies
freq = Hash.new
each { |e| freq[e] == nil ? freq[e] = 1 : freq[e] += 1 }
freq
end
def average
Rational(reduce(:+), length) unless length == 0
end
def drop_every(n)
i = 0
find_all { |e| (i+=1) % n != 0 } unless length == 0
end
def combine_with(other)
combo,i = Array.new,0
while i < [self.length, other.length].max # self used for clarity
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
end

Николай обнови решението на 11.10.2013 14:06 (преди около 11 години)

class Integer
def prime?
return false if self <= 1
(2...self).each { |i| return false if (self % i) == 0 }
true
end
def prime_factors
factors, a, i = Array.new, abs, 2
if i.prime? and a % i == 0
factors << i
a, i = a / i, 2
else i += 1
end while a > 1 or return factors.sort
end
def harmonic
- return nil if self < 1
-
sum = Rational(0)
+
(1..self).each { |i| sum += Rational(1,i) }
sum
end
def digits
digit = Array.new
n = abs
while n > 9
digit << n % 10
n/=10
end
(digit << n).reverse
end
end
class Array
def frequencies
freq = Hash.new
each { |e| freq[e] == nil ? freq[e] = 1 : freq[e] += 1 }
freq
end
def average
- Rational(reduce(:+), length) unless length == 0
+ Rational(reduce(:+), length)
end
def drop_every(n)
i = 0
- find_all { |e| (i+=1) % n != 0 } unless length == 0
+ find_all { |e| (i+=1) % n != 0 }
end
def combine_with(other)
combo,i = Array.new,0
while i < [self.length, other.length].max # self used for clarity
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
end

Ето малко бележки:

  • Ред 2 - не оставяй празни редове след началото на дефиницията на клас
  • Ред 6 - скобите в if-а са излишни, махни ги
  • В контекста на същия ред, бих предпочел number, вместо i като име на променлива
  • Потърси какво правят методите any? и all? и как може да ги извикваш; ще ти позволят да направиш това, което правиш на 6-ти ред по-елегантно и в стила на Ruby
  • Никога не създавай списък с Array.new, при положение, че си има литерален синтаксис за това - []; същото важи и за Hash.new; има си литерален синтаксис, който е {}
  • В prime_factors, a и i пак не са добри имена; особено a е ужасно име; съкращавайки два символа, не печелиш нищо, а губиш много; спазвай clarity over brevity
  • На ред 16, тялото на else-а трябва да е под самия else, идентирано навътре; не се записва на същия ред (виж style guide-а)
  • На ред 17, никога не слагай while по този начин; това е важна информация и да е навряна там не е добре, защото се пропуска (вж. форума, където го обсъждахме това вече); същото важи и за този ... or return ... – този стил се ползва рядко, основно при едноредови изрази и в случая няма нужда от return; изобщо, тук е станала голяма каша и се съмнявам, че имаш идея кое как и защо се случва; напиши го по-просто
  • За harmonic, потърси какво прави метода reduce и виж дали няма да ти свърши работа
  • На ред 23 трябва да има интервал след запетаята: 1, i
  • По същите причини, както и по-горе, n е лошо име за променлива; лошо е и да съкратиш frequencies на freq
  • Ред 33, интервали около /=; правилният запис е n /= 10
  • Това, което правиш на ред 36 не е готино; пренапиши го някак
  • Виж какво прави Hash.new(0) и виж дали няма да ти свърши работа за Array#frequencies
  • Погледни си условието за average, трябва да връща друго
  • Освен интервали около += на ред 53, стилът там е далеч от предпочитания за Ruby; това е по-скоро C с Ruby синтаксис
  • Ред 56, интервал след запетаите; другите проблеми с нещата на този ред съм ги споменал вече
  • Коментарът на ред 59 е абсолютно излишен, не оставяй такива коментари в кода си
  • Пробвай да потърсиш други методи, с които да реализираш combine_with (hint: виж какви методи има в Enumerable, тъй като тях ги има и на всеки масив)

Николай обнови решението на 16.10.2013 02:06 (преди около 11 години)

class Integer
-
def prime?
return false if self <= 1
- (2...self).each { |i| return false if (self % i) == 0 }
+ (2...self).each { |i| return false if self % i == 0 }
true
end
def prime_factors
- factors, a, i = Array.new, abs, 2
+ factors, a, i = [], abs, 2
if i.prime? and a % i == 0
factors << i
a, i = a / i, 2
else i += 1
- end while a > 1 or return factors.sort
+ end while a > 1 or return factors.sort #I know it is ugly
end
def harmonic
- sum = Rational(0)
-
- (1..self).each { |i| sum += Rational(1,i) }
- sum
+ (0..self).reduce { |sum, i| sum + Rational( 1, i) }
end
def digits
- digit = Array.new
- n = abs
-
- while n > 9
- digit << n % 10
- n/=10
- end
-
- (digit << n).reverse
+ to_s.split(//).collect { |letter| Integer(letter) }
end
+
end
class Array
def frequencies
- freq = Hash.new
- each { |e| freq[e] == nil ? freq[e] = 1 : freq[e] += 1 }
- freq
+ distribution = {}
+ each do |e|
+ distribution[e] == nil ? distribution[e] = 1 : distribution[e] += 1
+ end
+ distribution
end
def average
- Rational(reduce(:+), length)
+ reduce(:+) / length
end
def drop_every(n)
i = 0
find_all { |e| (i+=1) % n != 0 }
end
def combine_with(other)
- combo,i = Array.new,0
+ combo,i = [],0
- while i < [self.length, other.length].max # self used for clarity
+ while i < [self.length, other.length].max #I know it C-like
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
-end
+end

Николай обнови решението на 16.10.2013 02:08 (преди около 11 години)

class Integer
def prime?
return false if self <= 1
(2...self).each { |i| return false if self % i == 0 }
true
end
def prime_factors
factors, a, i = [], abs, 2
if i.prime? and a % i == 0
factors << i
a, i = a / i, 2
else i += 1
end while a > 1 or return factors.sort #I know it is ugly
end
def harmonic
(0..self).reduce { |sum, i| sum + Rational( 1, i) }
end
def digits
to_s.split(//).collect { |letter| Integer(letter) }
end
end
class Array
def frequencies
distribution = {}
each do |e|
distribution[e] == nil ? distribution[e] = 1 : distribution[e] += 1
end
distribution
end
def average
reduce(:+) / length
end
def drop_every(n)
i = 0
find_all { |e| (i+=1) % n != 0 }
end
def combine_with(other)
- combo,i = [],0
+ combo, i = [], 0
while i < [self.length, other.length].max #I know it C-like
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
end

Николай обнови решението на 16.10.2013 02:15 (преди около 11 години)

class Integer
def prime?
return false if self <= 1
(2...self).each { |i| return false if self % i == 0 }
true
end
def prime_factors
factors, a, i = [], abs, 2
if i.prime? and a % i == 0
factors << i
a, i = a / i, 2
else i += 1
end while a > 1 or return factors.sort #I know it is ugly
end
def harmonic
(0..self).reduce { |sum, i| sum + Rational( 1, i) }
end
def digits
- to_s.split(//).collect { |letter| Integer(letter) }
+ abs.to_s.split(//).collect { |letter| Integer(letter) }
end
end
class Array
def frequencies
distribution = {}
each do |e|
distribution[e] == nil ? distribution[e] = 1 : distribution[e] += 1
end
distribution
end
def average
- reduce(:+) / length
+ reduce(:+) / Float(length)
end
def drop_every(n)
i = 0
find_all { |e| (i+=1) % n != 0 }
end
def combine_with(other)
combo, i = [], 0
while i < [self.length, other.length].max #I know it C-like
combo << self[i] if i < self.length
combo << other[i] if i < other.length
i += 1
end
combo
end
end