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

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

Към профила на Радослав Върбанов

Резултати

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

Код

class Integer
def prime_divisors
div = []
num = self
num = num < 0 ? num * (-1) : num
2.upto(num) do |cur|
isprime = true
2.upto(cur - 1) do |check|
if (cur % check) == 0
isprime = false
break
end
end
if (num % cur) == 0 and isprime
div << cur
end
isprime = true
end
div
end
end
class Range
def fizzbuzz
rng = self
newrng = []
rng.each do |cur|
if (cur % 15) == 0
newrng[cur - 1] = :fizzbuzz
elsif (cur % 5) == 0
newrng[cur - 1] = :buzz
elsif (cur % 3) == 0
newrng[cur - 1] = :fizz
else
newrng[cur - 1] = cur
end
end
newrng
end
end
class Hash
def group_values
oldhash = self
newhash = Hash.new
curkeys = []
curval = 0
is_included = false
oldhash.each do |key, val|
curval = val
newhash.each do |nkey, nval|
if nval == val
is_included = true
end
end
oldhash.each do |tempkey, tempval|
if is_included == false and (curval == tempval)
curkeys << tempkey
end
end
newhash = newhash.merge({curval => curkeys})
curkeys = []
is_included = false
end
newhash
end
end
class Array
def densities
symbols = self
counts = []
cnt = 0
temp = 0
symbols.each do |sym|
cnt = cnt + 1
end
cnt = cnt - 1
0.upto cnt do |x|
0.upto cnt do |y|
if symbols[x] == symbols[y]
temp = temp + 1
end
end
counts << temp
temp = 0
end
counts
end
end

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

...F....

Failures:

  1) Range#fizzbuzz works with tricky ranges
     Failure/Error: (10...17).fizzbuzz.should eq [:buzz, 11, :fizz, 13, 14, :fizzbuzz, 16]
       
       expected: [:buzz, 11, :fizz, 13, 14, :fizzbuzz, 16]
            got: [nil, nil, nil, nil, nil, nil, nil, nil, nil, :buzz, 11, :fizz, 13, 14, :fizzbuzz, 16]
       
       (compared using ==)
     # /tmp/d20130307-6960-3jyd72/spec.rb:33:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.00779 seconds
8 examples, 1 failure

Failed examples:

rspec /tmp/d20130307-6960-3jyd72/spec.rb:32 # Range#fizzbuzz works with tricky ranges

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

Радослав обнови решението на 15.10.2012 02:42 (преди над 11 години)

+class Integer
+ def prime_divisors
+ div = []
+ num = self
+ num = num < 0 ? num * (-1) : num
+ 2.upto(num) do |cur|
+ isprime = true
+ 2.upto(cur - 1) do |check|
+ if (cur % check) == 0
+ isprime = false
+ break
+ end
+ end
+ if (num % cur) == 0 and isprime
+ div << cur
+ end
+ isprime = true
+ end
+ div
+ end
+end
+
+
+class Range
+ def fizzbuzz
+ rng = self
+ newrng = []
+ rng.each do |cur|
+ if (cur % 15) == 0
+ newrng[cur - 1] = :fizzbuzz
+ elsif (cur % 5) == 0
+ newrng[cur - 1] = :buzz
+ elsif (cur % 3) == 0
+ newrng[cur - 1] = :fizz
+ else
+ newrng[cur - 1] = cur
+ end
+ end
+ newrng
+ end
+end
+
+class Hash
+ def group_values
+ oldhash = self
+ newhash = Hash.new
+ curkeys = []
+ curval = 0
+ is_included = false
+
+ oldhash.each do |key, val|
+ curval = val
+
+ newhash.each do |nkey, nval|
+ if nval == val
+ is_included = true
+ end
+ end
+
+ oldhash.each do |tempkey, tempval|
+ if is_included == false and (curval == tempval)
+ curkeys << tempkey
+ end
+ end
+
+ newhash = newhash.merge({curval => curkeys})
+ curkeys = []
+ is_included = false
+ end
+ newhash
+ end
+end
+
+class Array
+ def densities
+ symbols = self
+ counts = []
+ cnt = 0
+ temp = 0
+ symbols.each do |sym|
+ cnt = cnt + 1
+ end
+ cnt = cnt - 1
+ 0.upto cnt do |x|
+ 0.upto cnt do |y|
+ if symbols[x] == symbols[y]
+ temp = temp + 1
+ end
+ end
+ counts << temp
+ temp = 0
+ end
+ counts
+ end
+end

Виждам, че си се утрепал от писане на код, който е страшно нетипичен за Ruby :) Ако беше на последната лекция, може би си видял примерния код, който ние показахме. Ако не си, виж презентацията от тогава. Също погледни решенията на твои колеги, на които сме дали бонус точки, за да видиш как изглеждат нещата в Ruby стил. Изисква време човек да привикне към този стил, така че не се притеснявай, че от първия път не си уцелил :) Ето малко коментари по текущото ти решение:

  • Вероятно знаеш, ако си бил на последната лекция, че имената на почти всичките ти променливи са зле избрани и че трябва да се постараеш повече в това направление следващия път
  • fizzbuzz и densities се получават много добре с map; допълнително, densities се прави на един ред, с този код: map { |item| count item } :)
  • Array.new, Hash.new и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е. [], {} и прочее
  • is_included == false, по-известно като !is_included... :)
  • Скобите в условията на ред 14, ред 61 не са нужни и се изпускат
  • Това newhash = newhash.merge({curval => curkeys}) е тъп начин да се запише newhash[curval] = curkeys (игнорирам зле именованите променливи)
  • За ред 5 си има метод abs :)

Следващия път очакваме да си надобрял :)