Решение на Първа задача от Мартин Христов

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

Към профила на Мартин Христов

Резултати

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

Код

def series(name, number)
if name == 'fibonacci'
sequence(1, 1, number)
elsif name == 'lucas'
sequence(2, 1, number)
else
sequence(1, 1, number) + sequence(2, 1, number)
end
end
def sequence(first, second, number)
number == 1 ? first : sequence(second, first + second, number - 1)
end

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

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

Finished in 0.00941 seconds
12 examples, 0 failures

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

Мартин обнови решението на 09.10.2014 01:25 (преди около 10 години)

+def series(name, number)
+ name == 'fibonacci' ? sequence(1,1, number) : ( name == 'lucas' ?
+ sequence(2,1, number) : sequence(1,1, number) + sequence(2,1, number))
+
+end
+
+def sequence(a, b, n)
+ n == 1 ? a : sequence(b, a + b, n - 1)
+end
  • Като цяло проблемите ти могат да се сумаризират с четимост > малък брой символи.
  • Използваш вложен тернарен оператор, което не е ok.
  • Леко е философско дали a и b са добри имена на променливи. Може би n в този конкретен случай е един от малкото примери, където еднобуквено име е приемливо, но се опитвай да пазиш именуването си консистентно. Или на двете места трябва да е n, или number.
  • Имаш проблеми с whitespaces. Прочети style guide-ът.

Мартин обнови решението на 09.10.2014 11:13 (преди около 10 години)

def series(name, number)
- name == 'fibonacci' ? sequence(1,1, number) : ( name == 'lucas' ?
- sequence(2,1, number) : sequence(1,1, number) + sequence(2,1, number))
-
+ if name == 'fibonacci'
+ sequence(1,1,number)
+ elsif name == 'lucas'
+ sequence(2,1,number)
+ else
+ sequence(1,1, number) + sequence(2,1, number)
+ end
end
-def sequence(a, b, n)
- n == 1 ? a : sequence(b, a + b, n - 1)
+def sequence(a, b, number)
+ number == 1 ? a : sequence(b, a + b, number - 1)
end

Мартин обнови решението на 09.10.2014 11:17 (преди около 10 години)

def series(name, number)
if name == 'fibonacci'
- sequence(1,1,number)
+ sequence(1, 1, number)
elsif name == 'lucas'
- sequence(2,1,number)
+ sequence(2, 1, number)
else
- sequence(1,1, number) + sequence(2,1, number)
+ sequence(1, 1, number) + sequence(2, 1, number)
end
end
def sequence(a, b, number)
number == 1 ? a : sequence(b, a + b, number - 1)
end
  • a и b са по-добре от arg1 и arg2. Имената, които най-добре описват семантиката в случая са first_member и second_member. Ако много настояваш да си оставиш метода като one-liner можеш да ги съкратиш до first и second. Малко спорно, но според мен също ok са x1 и x2.
  • Опционално можеш да разгледаш и case (switch-ът в Ruby), но и така решението ти е напълно наред.

Мартин обнови решението на 09.10.2014 11:51 (преди около 10 години)

def series(name, number)
if name == 'fibonacci'
sequence(1, 1, number)
elsif name == 'lucas'
sequence(2, 1, number)
else
sequence(1, 1, number) + sequence(2, 1, number)
end
end
-def sequence(a, b, number)
- number == 1 ? a : sequence(b, a + b, number - 1)
+def sequence(first, second, number)
+ number == 1 ? first : sequence(second, first + second, number - 1)
end

Няма проблем да ползваш then на същия ред на when.

След крайния срок решенията стават публични. После пускаме и тестовете и си получавате точките според това колко минават. Накрая може да даваме +/- точки на много добри решения/такива, които трагично нарушават конвенции или добри практики, които сме споменали. Изключително сме щастливи от факта, че си предал решение веднага :)