Решение на Първа задача от Камен Станев

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

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

Резултати

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

Код

def complete_sequence(sequence, index)
(index - sequence.size).times { sequence << sequence[-1] + sequence[-2] }
sequence
end
def fibonacci(index)
complete_sequence([1, 1], index)[index - 1]
end
def lucas(index)
complete_sequence([2, 1], index)[index - 1]
end
def series(type, index)
case type
when "fibonacci" then fibonacci(index)
when "lucas" then lucas(index)
when "summed" then fibonacci(index) + lucas(index)
end
end

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

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

Finished in 0.00996 seconds
12 examples, 0 failures

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

Камен обнови решението на 10.10.2014 17:09 (преди около 10 години)

+def complete_sequence_and_return_index(sequence, index)
+ (index - sequence.size).times { sequence.push(sequence[-1] + sequence[-2]) }
+ sequence[index - 1] # index is not 0 based, arrays are 0 bazed
+end
+
+def fibonacci(index)
+ complete_sequence_and_return_index([1, 1], index)
+end
+
+def lucas(index)
+ complete_sequence_and_return_index([2, 1], index)
+end
+
+def series(type, index)
+ if type == 'fibonacci'
+ return fibonacci(index)
+ elsif type == 'lucas'
+ return lucas(index)
+ end
+ fibonacci(index) + lucas(index)
+end
+

Като цяло решението ми харесва. Леки забележки:

  • Опитай се да измислиш по-добро име от complete_sequence_and_return_index. Най-малкото не връщаш индекс, а стойността на index члена на редицата. По принцип не трябва да щадиш символи при именуването, но ако стигнеш до нещо много конкретно и вербозно за сравнително простичък проблем, вероятно има друга алтернатива.
  • Махни коментара, напълно ненужен е. Aко си се чудил кое от двете е правилно - пише се based. :)
  • Сложи празен ред между изчисленията и връщаната стойност в complete_sequence_and_return_index за по-добра четимост.
  • Не слагай празен ред на края на файла.
  • Опционално можеш да вкараш summed случая на series в else клауза и да махнеш return-ите, за да видиш дали повече ще ти хареса. Разгледай и case.
  • По същия начин експериментирай и с push vs <<.

Камен обнови решението на 12.10.2014 19:55 (преди около 10 години)

-def complete_sequence_and_return_index(sequence, index)
- (index - sequence.size).times { sequence.push(sequence[-1] + sequence[-2]) }
- sequence[index - 1] # index is not 0 based, arrays are 0 bazed
+def complete_sequence(sequence, index)
+ (index - sequence.size).times { sequence << sequence[-1] + sequence[-2] }
+
+ sequence
end
def fibonacci(index)
- complete_sequence_and_return_index([1, 1], index)
+ complete_sequence([1, 1], index)[index - 1]
end
def lucas(index)
- complete_sequence_and_return_index([2, 1], index)
+ complete_sequence([2, 1], index)[index - 1]
end
def series(type, index)
- if type == 'fibonacci'
- return fibonacci(index)
- elsif type == 'lucas'
- return lucas(index)
+ case type
+ when "fibonacci" then fibonacci(index)
+ when "lucas" then lucas(index)
+ when "summed" then fibonacci(index) + lucas(index)
end
- fibonacci(index) + lucas(index)
end
-
  • Принципно е добре да се придържаш към низове с единични кавички, освен ако не използваш специалните свойства на низ с двойни кавички (например, интерполация).
  • Бих подравнил вертикално then клаузите на case-а.

В случая е малко overkill да създаваш списък с всички елементи от поредицата, само за да вземеш N-тия след това.