Решение на Първа задача от Явор Михайлов

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

Към профила на Явор Михайлов

Резултати

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

Код

def series(name_of_series, element)
case name_of_series
when 'fibonacci' then fibonacci(element)
when 'lucas' then lucas(element)
when 'summed' then summed(element)
end
end
def fibonacci(element)
return 1 if element <= 2
fibonacci(element - 1) + fibonacci(element - 2)
end
def lucas(element)
return 2 if element == 1
return 1 if element == 2
lucas(element - 1) + lucas(element - 2)
end
def summed(element)
fibonacci(element) + lucas(element)
end

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

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

Finished in 0.02188 seconds
12 examples, 0 failures

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

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

+def series(type, n)
+ send(type, n)
+end
+
+def fibonacci(n)
+ return n if n < 2
+
+ fibonacci(n - 1) + fibonacci(n - 2)
+end
+
+def lucas(n)
+ return n + 1 if n < 2
+
+ lucas(n - 1) + lucas(n - 2)
+end
+
+def summed(n)
+ fibonacci(n) + lucas(n)
+end

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

-def series(type, n)
- send(type, n)
+def series(type, number)
+ send(type, number)
end
-def fibonacci(n)
- return n if n < 2
+def fibonacci(number)
+ return number if number < 2
- fibonacci(n - 1) + fibonacci(n - 2)
+ fibonacci(number - 1) + fibonacci(number - 2)
end
-def lucas(n)
- return n + 1 if n < 2
+def lucas(number)
+ return 2 if number == 1
+ return 1 if number == 2
- lucas(n - 1) + lucas(n - 2)
+ lucas(number - 1) + lucas(number - 2)
end
-def summed(n)
- fibonacci(n) + lucas(n)
+def summed(number)
-end
+ fibonacci(number) + lucas(number)
+end

В общи линии доста прилично. Няколко неща:

  • Много се радвам, че си разгледал send. Но като цяло очаквахме да използвате базови инструменти за проста задача. Ще ви говорим много за метапрограмиране и ще ви напомняме постоянно да не го употребявате, освен ако не fit-ват точно за дадения проблем. Прави написаното по-малко четимо и предвидимо, в общия случай се смята за code smell. Още повече, че send върху глобалния scope не е супер якото нещо. :)
  • Мисля, че си първият човек, който се е сетил сам да слага нови редове в методите за разделение. Кодът е добре и така, но ако искаш може да експериментираш дали няма да ти хареса повече с case или обикновен if - elsif - else.
  • Леко си разширил дефиниционното множество на нашия fibonacci. Напълно оk e да връщаш или да гърмиш както си искаш за недефинираните случаи. Но когато е без trade-off, старай и кодът ти да се държи все едно поведението при тях е неясно, не да разчита на имплементационна магия. :)
  • fibonacci и lucas са имена на, а не типове редици. Наша грешка, поправихме се.

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

-def series(type, number)
- send(type, number)
+def series(name_of_series, element)
+ case name_of_series
+ when 'fibonacci' then fibonacci(element)
+ when 'lucas' then lucas(element)
+ when 'summed' then summed(element)
+ end
end
-def fibonacci(number)
- return number if number < 2
+def fibonacci(element)
+ return 1 if element <= 2
- fibonacci(number - 1) + fibonacci(number - 2)
+ fibonacci(element - 1) + fibonacci(element - 2)
end
-def lucas(number)
- return 2 if number == 1
- return 1 if number == 2
+def lucas(element)
+ return 2 if element == 1
+ return 1 if element == 2
- lucas(number - 1) + lucas(number - 2)
+ lucas(element - 1) + lucas(element - 2)
end
-def summed(number)
- fibonacci(number) + lucas(number)
+def summed(element)
+ fibonacci(element) + lucas(element)
end