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

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

Към профила на Николина Гюрова

Резултати

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

Код

def series(name, number)
if name == 'summed'
return series('fibonacci', number) + series('lucas', number)
end
series_at_position(series_start(name), number)
end
def series_at_position(previous, number)
if number == 1
previous[0]
else
series_at_position([previous[1], previous[0] + previous[1]], number - 1)
end
end
def series_start(name)
start_at = {
fibonacci: [1, 1],
lucas: [2, 1],
}
start_at[name.to_sym]
end

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

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

Finished in 0.01324 seconds
12 examples, 0 failures

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

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

+def series(series_name, number)
+ if series_name == 'summed'
+ return series('fibonacci', number) + series('lucas', number)
+ end
+ get_number_at_position(get_series_array(series_name), number)
+end
+
+def get_number_at_position(array, number)
+ for i in 2...number do
+ array[i] = array[i - 1] + array[i - 2]
+ end
+ array[number - 1]
+end
+
+def get_series_array(series_name)
+ numbers_hash = {
+ fibonacci: [1, 1],
+ lucas: [2, 1]
+ }
+ numbers_hash[series_name.to_sym]
+end
  • Опитай се да измислиш малко по-добри имена. get_ префиксът не дава много допълнителна информация. В идеалния случай в имената не трябва да има намек за имплементацията (aka не би следвало да има думи като recursion, array и т.н.), а за семантиката им (какво значат в контекста на решавания проблем). Еднобуквени именена почти никога не са ok. array e много общо. Изрази точно какво значи точно този масив в точно тази ситуация чрез името. Не слагай като префикс или суфикс типа на променливите (numbers_hash).
  • Възможно е for да ти изглежда много интуитивен, ако идваш от други езици. В Ruby обаче се гледа много лошо на код с for-ове. Използвай #each, ако имаш нужда от итериране на нещо само за странични ефекти.
  • Слагай един празен ред между главните изчисления и връщаната стойност или изключителните случаи и главната логика за по-добра четимост в методите.
  • Експериментирай дали с case или if - else кодът ти ще изглежда по-ясен.
  • (x..y) и (x...y) обикновено се използват в комбинация с when или ===. За дадената ситуация се предпочита x.upto(y) или x.upto(y.pred).
  • Прилежно е да си подравняваш някои хомогенни конструкции, когато са употребени на съседни редове. Сред тях са =, then и стойностите на hash-ове.
  • Също се смята за добра практика да слагаш , на последния ред в hash-овете. Изглежда по-консистентно с другите редове и дава възможността да разместваш свободно.

Николина обнови решението на 13.10.2014 23:53 (преди около 10 години)

-def series(series_name, number)
- if series_name == 'summed'
+def series(name, number)
+ if name == 'summed'
return series('fibonacci', number) + series('lucas', number)
end
- get_number_at_position(get_series_array(series_name), number)
+
+ series_at_position(series_start(name), number)
end
-def get_number_at_position(array, number)
- for i in 2...number do
- array[i] = array[i - 1] + array[i - 2]
+def series_at_position(previous, number)
+ if number == 1
+ previous[0]
+ else
+ series_at_position([previous[1], previous[0] + previous[1]], number - 1)
end
- array[number - 1]
end
-def get_series_array(series_name)
- numbers_hash = {
- fibonacci: [1, 1],
- lucas: [2, 1]
+def series_start(name)
+ start_at = {
+ fibonacci: [1, 1],
+ lucas: [2, 1],
}
- numbers_hash[series_name.to_sym]
+
+ start_at[name.to_sym]
end