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

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

Към профила на Александър Начев

Резултати

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

Код

def sequence (index, start)
sequence = (index-2).times.each_with_object(start) do
|first, second| second << second[-2] + second[-1]
end
return sequence[index-1]
end
def series (series_name, index)
case series_name
when 'fibonacci' then return sequence(index, [1,1])
when 'lucas' then return sequence(index, [2,1])
when 'summed' then return sequence(index, [1,1]) + sequence(index, [2,1])
end
end

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

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

Finished in 0.01929 seconds
12 examples, 0 failures

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

Александър обнови решението на 14.10.2014 11:58 (преди около 10 години)

+def lucas(n)
+ lucas=n.times.each_with_object([2,1]) { |n, l| l << l[-2] + l[-1] }
+ lucas[n-1]
+end
+
+def fibonacci(n)
+ fibonacci=n.times.each_with_object([0,1]) { |n, f| f << f[-2] + f[-1] }
+ fibonacci[n]
+end
+
+def series (string, n)
+ case string
+ when 'fibonacci' then return fibonacci(n)
+ when 'lucas' then return lucas(n)
+ when 'summed' then return lucas(n) + fibonacci(n)
+ end
+end

Хубаво решение, ако го дооправиш малко, ще стане супер !

Ето ти и насоки :smiley: :

  • Форматиране на кода ! Оставяй празни места около оператори (=, -, ...). Виж как се индентира правилно case. Освен това можеш да подравниш then-овете да са един под друг за естетика. Ей така:

    when 'beautiful' then ...
    when 'ugly'      then ...
    
  • Функциите fibonacci и lucas ти изглеждат почти еднакво. Опитай се да измъкнеш общата логика в отделна функция. На нея можеш да подаваш началните стойности.
  • Имената на променливите fibonacci, lucas не са ок. Може би sequence е по-подходящо. Ако ти станат много дълги редовете и скептикът се оплаква, може да подаваш блоковете на each_with_object чрез do, end.

  • l, string не са хубави имена. Много са общи, не ти казват нищо за същността на обекта, който стои зад това име. Помисли за други имена.

  • Променливата n, която създаваш в блоковете на each_with_object, никъде не се ползва в самия блок. Тогава можеш да я именуваш като _. Това е добра практика.

  • За Лукас използваш първите две числа [2,1], но за Фибоначи ползваш нулевото и първото - [0,1]. Бъди консистентен в избора си. В случая е по-добре и на двете места да подаваш първия и втория член, по-ясно е така.

  • n.times... прави малко повече изчисления отколкото трябва. За първия член (n = 1) ще се изпълни 1.times..., което ще ти пресметне третия член, а реално нямаш нужда от него. Помисли как можеш да го оправиш.

Александър обнови решението на 15.10.2014 02:16 (преди около 10 години)

-def lucas(n)
- lucas=n.times.each_with_object([2,1]) { |n, l| l << l[-2] + l[-1] }
- lucas[n-1]
+def sequence (index, start)
+ sequence = (index-2).times.each_with_object(start) do
+ |first, second| second << second[-2] + second[-1]
+ end
+ return sequence[index-1]
end
-def fibonacci(n)
- fibonacci=n.times.each_with_object([0,1]) { |n, f| f << f[-2] + f[-1] }
- fibonacci[n]
-end
-
-def series (string, n)
- case string
- when 'fibonacci' then return fibonacci(n)
- when 'lucas' then return lucas(n)
- when 'summed' then return lucas(n) + fibonacci(n)
+def series (series_name, index)
+ case series_name
+ when 'fibonacci' then return sequence(index, [1,1])
+ when 'lucas' then return sequence(index, [2,1])
+ when 'summed' then return sequence(index, [1,1]) + sequence(index, [2,1])
end
end
  • Всички return-и са излишни. В руби последният оценен израз от функция е return стойността на функцията по подразбиране.

  • start като име горе-долу става, нo пак нещо липсва. start_values или initial_values, а може би initial_members.

  • В блока на each_with_object замени first с _. Това е конвенцията за именуване на променливи, които не се използват.

  • Няма нужда да запазваш резултата върнат от each_with_object в променлива. Можеш директно след като е върнат, в края на блока да му извикаш []. Ей така end[index - 1].

  • second не е хубаво име. Може да го именуваш sequence (ако успееш да промениш нещата от горната точка), или numbers, members, нещо такова.

  • Винаги оставяй интервал след запетая :)