Решение на Първа задача от Георги Железов

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

Към профила на Георги Железов

Резултати

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

Код

def series(pattern, width)
case pattern
when "fibonacci" then fibonacci(width)
when "lucas" then lucas(width)
when "summed" then summed(width)
end
end
def fibonacci(width, initial = [1,1])
width.times do |x|
if x > 1 then initial.push(initial[x-1]+initial[x-2]) end
end
initial.last
end
def lucas(width)
fibonacci(width, initial =[2,1])
end
def summed(width)
fibonacci(width) + lucas(width)
end

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

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

Failures:

  1) series handles lucas series for base cases
     Failure/Error: series('lucas', 1).should eq 2
       
       expected: 2
            got: 1
       
       (compared using ==)
     # /tmp/d20141023-2426-1761f04/spec.rb:25: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) series handles summed series for base cases
     Failure/Error: series('summed', 1).should eq 3
       
       expected: 3
            got: 2
       
       (compared using ==)
     # /tmp/d20141023-2426-1761f04/spec.rb:45: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.00981 seconds
12 examples, 2 failures

Failed examples:

rspec /tmp/d20141023-2426-1761f04/spec.rb:24 # series handles lucas series for base cases
rspec /tmp/d20141023-2426-1761f04/spec.rb:44 # series handles summed series for base cases

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

Георги обнови решението на 12.10.2014 15:02 (преди около 10 години)

+def series(pattern, width)
+ if pattern == "fibonacci" then fibonacci(width) end
+ if pattern == "lucas" then lucas(width) end
+ if pattern == "summed" then summed(width) end
+end
+
+def fibonacci(width, arr = [1,1])
+ for i in 0...width
+ if i > 1
+ arr.push(arr[i-1]+arr[i-2])
+ end
+ end
+ arr.last
+end
+
+def lucas(width)
+ fibonacci(width, arr =[2,1])
+end
+
+def summed(width)
+ fibonacci(width) + lucas(width)
+end

Георги обнови решението на 12.10.2014 21:43 (преди около 10 години)

def series(pattern, width)
- if pattern == "fibonacci" then fibonacci(width) end
- if pattern == "lucas" then lucas(width) end
- if pattern == "summed" then summed(width) end
+ case pattern
+ when "fibonacci" then fibonacci(width)
+ when "lucas" then lucas(width)
+ when "summed" then summed(width)
+ end
end
def fibonacci(width, arr = [1,1])
for i in 0...width
if i > 1
arr.push(arr[i-1]+arr[i-2])
end
end
arr.last
end
def lucas(width)
fibonacci(width, arr =[2,1])
end
def summed(width)
fibonacci(width) + lucas(width)
end

Георги обнови решението на 12.10.2014 21:44 (преди около 10 години)

def series(pattern, width)
case pattern
- when "fibonacci" then fibonacci(width)
+ when "fibonacci" then fibonacci(width)
when "lucas" then lucas(width)
when "summed" then summed(width)
end
end
def fibonacci(width, arr = [1,1])
for i in 0...width
if i > 1
arr.push(arr[i-1]+arr[i-2])
end
end
arr.last
end
def lucas(width)
fibonacci(width, arr =[2,1])
end
def summed(width)
fibonacci(width) + lucas(width)
end

Привет :)

  • Винаги си пускай примерните тестове преди да предаваш. В случая series('lucas', 1) не ти работи коректно.
  • Не е много добре да ползваш fibonacci за да смяташ lucas. Реално твоята функция fibonacci прави нещо повече. Тя пресмята всякакви редици, които има зависимост, че всеки член е сумата на двата предходни. Хубаво е тази логика да я отделиш в друга функция, например generic_series. И да викаш нея във fibonacci и lucas.
  • В руби общността въобще не се кефим на for. Ако си бил на лекцията вчера, може би си разбрал защо. for отдолу работи с each и освен това е с дразнещо процедурен синтаксис. Винаги предпочитай each пред for, освен ако нямаш наистина добра причина за обратното.
  • На 19-ти ред можеш да извикаш фунцкията просто така fibonacci(width, [2,1]). Това присвояване, което ти правиш е излишно, защото то създава променливата arr, която после не се ползва никъде. Тази конструкция работи, защото в руби присвояването се оценява до присвоената стойност.
  • arr е кофти име на променлива. Не носи никаква семантика за значението на променливата. Ако масива ти съдържа членове от математическа редица, наречи го sequence, или members примерно. Ако съдържа само началните стойност initial_values може би е добро име.
  • width е лошо име в този контекст. Width се превежда като ширина. Не е ок. Помисли за друго име.
  • Оставяй места около операторите (=, -, <= и т.н). Виж style guide-a

Георги обнови решението на 14.10.2014 10:17 (преди около 10 години)

def series(pattern, width)
case pattern
when "fibonacci" then fibonacci(width)
when "lucas" then lucas(width)
when "summed" then summed(width)
end
end
-def fibonacci(width, arr = [1,1])
- for i in 0...width
- if i > 1
- arr.push(arr[i-1]+arr[i-2])
- end
+def fibonacci(width, initial = [1,1])
+ width.times do |x|
+ if x > 1 then initial.push(initial[x-1]+initial[x-2]) end
end
- arr.last
+ initial.last
end
def lucas(width)
- fibonacci(width, arr =[2,1])
+ fibonacci(width, initial =[2,1])
end
def summed(width)
fibonacci(width) + lucas(width)
end
  • Имаш известно количество проблеми с конвенцията, главно whitespaces. Погледни style guide-a, за да ги адресираш.
  • В lucas със initial =[2,1] не подаваш именуван аргумент, а правиш локална променлива, присвояваш й [2,1] и резултатът от присвояването (пак [2,1]) се предава на fibonacci.
  • Трябва да поработиш над измислянето на имена. В series не ви даваме патърн, а име на редица. Не даваме широчина, а номер на искания елемент. Също initial не казва много, освен че е нещо начално. Опитвай се имената да носят семантиката на съдържанието си.
  • В Ruby се смята за добра практика да подравняваш някои конструкции, когато се срещат на съседни редове. Сред тях са =, then и стойностите на hash-овете.
  • Силно ти препоръчвам да си пуснеш примерните тестове.