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

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

Към профила на Станислав Венков

Резултати

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

Код

def series(function_name, number)
searched_number = fibonacci_number(number) if function_name == 'fibonacci'
searched_number = lucas_number(number) if function_name == 'lucas'
searched_number = summed_number(number) if function_name == 'summed'
searched_number
end
def fibonacci_number(number)
fibonacci_numbers = {0 => 0, 1 => 1}
2.upto(number+1).each do |i|
fibonacci_numbers[i] = fibonacci_numbers[i-1] + fibonacci_numbers[i-2]
end
fibonacci_numbers[number]
end
def lucas_number(number)
lucas_numbers = {2 => 1, 1 => 2}
3.upto(number+1).each do |i|
lucas_numbers[i] = lucas_numbers[i-1] + lucas_numbers[i-2]
end
lucas_numbers[number]
end
def summed_number(number)
fibonacci_number(number) + lucas_number(number)
end

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

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

Finished in 0.01352 seconds
12 examples, 0 failures

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

Станислав обнови решението на 11.10.2014 00:41 (преди около 10 години)

+def series(string, number)
+ if string == 'fibonacci' then result = fibonacci_flow(number) end
+ if result == nil && string == 'lucas' then result = lucas_flow(number) end
+ if result == nil && string == 'summed' then result = summed(number) end
+ result
+end
+def fibonacci_flow(number)
+ array = Array.new
+ (0...number+1).each do |i|
+ if i==0 || i==1 then array[i]=i else array[i]=array[i-1]+array[i-2] end
+ end
+ array[number]
+end
+def lucas_flow(number)
+ numbers = { 2 => 1, 1 => 2 }
+ (3...number+1).each do |i|
+ numbers[i] = numbers[i-1] + numbers[i-2]
+ end
+ numbers[number]
+end
+def summed(number)
+ fibonacci_flow(number) + lucas_flow(number)
+end
  • Имаш известно количество проблеми с конвенциите. Моля прочети style guide-a, за да ги адресираш. Някои от тях включват липса на whitespaces, използване на едноредов if (можеш да го замениш според ситуацията с тернарен оператор - ?:, обърнат - x if y, многоредов, или с case), конструирането на масив, предпочитание на ||/&& пред or/and.
  • Опитай се да подобриш избора си на имена. Те трябва да са (в този ред по важност) смислени, близо до домейна на решавания проблем, консистентни и кратки. Например string, array и result са много generic. Всеки string можеше да се казва string, всеки array можеше да се казва array и резултатът от каквото и да е можеше да се казва result. Въпросът е каква е семантиката на точно този string от гледна точка на дадената задача? Еднобуквени имена на променливи са ok в много малка част от случаите. Защо сложи _flow в края на fibonacci_flow и lucas_flow? Не носи никаква допълнителна информация и е объркващо. Още повече трябваше да кръстиш и summed summed_flow, за да го запазиш подобен на останалите.
  • Леко изненадващо е, че fibonacci и lucas са почти едни и същи, а имплементацията ти варира драстично. Опитай се да ги унифицираш.
  • (x...y) всъщност е същото като (x..y - 1). По принцип (x..y) и (x...y) вървят заедно с === или when, за другите случаи се предпочита x.upto(y).
  • Имаше ли смисъл да проверяваш дали result е nil?
  • Слагай един празен ред между изчисленията и последното връщане на стойност за по-добра четимост.

Ако срещнеш проблеми с която и да е от горните точки не се притеснявай да оставиш коментар.

Станислав обнови решението на 13.10.2014 22:19 (преди около 10 години)

-def series(string, number)
- if string == 'fibonacci' then result = fibonacci_flow(number) end
- if result == nil && string == 'lucas' then result = lucas_flow(number) end
- if result == nil && string == 'summed' then result = summed(number) end
- result
+def series(function_name, number)
+ searched_number = fibonacci_number(number) if function_name == 'fibonacci'
+ searched_number = lucas_number(number) if function_name == 'lucas'
+ searched_number = summed_number(number) if function_name == 'summed'
+
+ searched_number
end
-def fibonacci_flow(number)
- array = Array.new
- (0...number+1).each do |i|
- if i==0 || i==1 then array[i]=i else array[i]=array[i-1]+array[i-2] end
+
+def fibonacci_number(number)
+ fibonacci_numbers = {0 => 0, 1 => 1}
+
+ 2.upto(number+1).each do |i|
+ fibonacci_numbers[i] = fibonacci_numbers[i-1] + fibonacci_numbers[i-2]
end
- array[number]
+
+ fibonacci_numbers[number]
end
-def lucas_flow(number)
- numbers = { 2 => 1, 1 => 2 }
- (3...number+1).each do |i|
- numbers[i] = numbers[i-1] + numbers[i-2]
+
+def lucas_number(number)
+ lucas_numbers = {2 => 1, 1 => 2}
+
+ 3.upto(number+1).each do |i|
+ lucas_numbers[i] = lucas_numbers[i-1] + lucas_numbers[i-2]
end
- numbers[number]
+
+ lucas_numbers[number]
end
-def summed(number)
- fibonacci_flow(number) + lucas_flow(number)
+
+def summed_number(number)
+
+ fibonacci_number(number) + lucas_number(number)
+
end