Решение на Първа задача от Екатерина Горанова

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

Към профила на Екатерина Горанова

Резултати

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

Код

def series(sequence, number)
if sequence == 'fibonacci' then get_nth_element(1, 1, number)
elsif sequence == 'lucas' then get_nth_element(2, 1, number)
elsif sequence == 'summed'
get_nth_element(1, 1, number) + get_nth_element(2, 1, number)
end
end
def get_nth_element(first_element, second_element, number)
consecutive_2 = [first_element, second_element]
2.upto(number) do
consecutive_2 = [consecutive_2[1], consecutive_2[0] + consecutive_2[1]]
end
consecutive_2.first
end

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

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

Finished in 0.01319 seconds
12 examples, 0 failures

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

Екатерина обнови решението на 10.10.2014 22:10 (преди около 10 години)

+def series(sequence, n)
+ case sequence
+ when 'fibonacci' then calculate 1, 1, n
+ when 'lucas' then calculate 2, 1, n
+ when 'summed' then (calculate 1, 1, n) + (calculate 2, 1, n)
+ end
+end
+
+def calculate(a, b, n)
+ (n-1).times { a, b = b, a+b }
+ a
+end

Екатерина обнови решението на 10.10.2014 22:13 (преди около 10 години)

def series(sequence, n)
case sequence
when 'fibonacci' then calculate 1, 1, n
when 'lucas' then calculate 2, 1, n
when 'summed' then (calculate 1, 1, n) + (calculate 2, 1, n)
end
end
def calculate(a, b, n)
- (n-1).times { a, b = b, a+b }
+ (n - 1).times { a, b = b, a + b }
a
end

Екатерина обнови решението на 10.10.2014 22:21 (преди около 10 години)

-def series(sequence, n)
+def series(sequence, number)
case sequence
- when 'fibonacci' then calculate 1, 1, n
- when 'lucas' then calculate 2, 1, n
- when 'summed' then (calculate 1, 1, n) + (calculate 2, 1, n)
+ when 'fibonacci' then calculate 1, 1, number
+ when 'lucas' then calculate 2, 1, number
+ when 'summed' then (calculate 1, 1, number) + (calculate 2, 1, number)
end
end
-def calculate(a, b, n)
- (n - 1).times { a, b = b, a + b }
- a
+def calculate(first, second, number)
+ (number - 1).times { first, second = second, first + second }
+ first
end
  • Това не е един от случаите, в които би искала да пропуснеш скоби при извикване на метод. Виж style guide-a за повече яснота.
  • Какво са first и second? Може би първият и вторият ред на редицата. Но после стават нещо друго. Също calculate е доста generic. Опитай се да изкажеш каква е семантиката на метода чрез името му. Всичко, което изчислява нещо може да се казва calculate, какво се изчислява не става ясно за читателя.
  • Много се радвам, че си видяла едноредовото присвояване. Но като цяло избягвай да го използваш в цикли - не винаги е най-четимото нещо, а и създава масиви скрито. По принцип не гоним оптималност на кода, но излишното spawn-ване на множество short lived обекти не е добра практика.
  • В Ruby се смята за прилежно да подравняваш някои повтарящи се на съседни редове конструкции. В това число са = и then.
  • Не е грешно, но щеше да изглежда по-приятно, ако беше chain-нала някой от методите на Fixnum, вместо да използваш (number - 1). Може да погледнеш документацията за вдъхновение.

Ако адресираш горните точки и останеш с ясен и кратък код, решението ти ще е супер. (:

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

-def series(sequence, number)
+def series(sequence, n)
case sequence
- when 'fibonacci' then calculate 1, 1, number
- when 'lucas' then calculate 2, 1, number
- when 'summed' then (calculate 1, 1, number) + (calculate 2, 1, number)
+ when 'fibonacci' then get_nth_element(1, 1, n)
+ when 'lucas' then get_nth_element(2, 1, n)
+ when 'summed' then get_nth_element(1, 1, n) + get_nth_element(2, 1, n)
end
end
-def calculate(first, second, number)
- (number - 1).times { first, second = second, first + second }
- first
+def get_nth_element(first_element, second_element, n)
+ sequence = [first_element, second_element]
+ 3.upto(n) do
+ sequence << sequence[sequence.size - 1] + sequence[sequence.size - 2]
+ end
+ sequence[-1]
end
  • get_nth_element все още може да се подобри.
  • Можеше ли sequence[sequence.size - 1] + sequence[sequence.size - 2] да се пренапишат с отрицателни индекси?
  • Има малко по-добра алтернатива на [-1] за вземане на последния елемент. Погледни документацията на Array, за да почерпиш вдъхновение.
  • Силно ти препоръчвам да си пуснеш примерните тестове.

Екатерина обнови решението на 15.10.2014 10:46 (преди около 10 години)

def series(sequence, n)
case sequence
when 'fibonacci' then get_nth_element(1, 1, n)
when 'lucas' then get_nth_element(2, 1, n)
when 'summed' then get_nth_element(1, 1, n) + get_nth_element(2, 1, n)
end
end
def get_nth_element(first_element, second_element, n)
- sequence = [first_element, second_element]
- 3.upto(n) do
- sequence << sequence[sequence.size - 1] + sequence[sequence.size - 2]
+ consecutive_2 = [first_element, second_element]
+ 2.upto(n) do
+ consecutive_2 = [consecutive_2[1], consecutive_2[0] + consecutive_2[1]]
end
- sequence[-1]
+ consecutive_2.first
end

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

-def series(sequence, n)
- case sequence
- when 'fibonacci' then get_nth_element(1, 1, n)
- when 'lucas' then get_nth_element(2, 1, n)
- when 'summed' then get_nth_element(1, 1, n) + get_nth_element(2, 1, n)
+def series(sequence, number)
+ if sequence == 'fibonacci' then get_nth_element(1, 1, number)
+ elsif sequence == 'lucas' then get_nth_element(2, 1, number)
+ elsif sequence == 'summed'
+ get_nth_element(1, 1, number) + get_nth_element(2, 1, number)
end
end
-def get_nth_element(first_element, second_element, n)
+def get_nth_element(first_element, second_element, number)
consecutive_2 = [first_element, second_element]
- 2.upto(n) do
+ 2.upto(number) do
consecutive_2 = [consecutive_2[1], consecutive_2[0] + consecutive_2[1]]
end
consecutive_2.first
end