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

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

Към профила на Костадин Петричков

Резултати

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

Код

def fibonacci(index)
if index < 2
index
else
fibonacci(index-1) + fibonacci(index-2)
end
end
def lucas(index)
if index == 1
2
elsif index == 2
1
else
fibonacci(index-1) + fibonacci(index-2)
end
end
def series(summed, index)
if summed == "summed" then return fibonacci(index) + lucas(index) end
if summed == "fibonacci" then return fibonacci(index) end
if summed == "lucas" then return lucas(index) end
end

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

.....FFF.FFF

Failures:

  1) series handles lucas series for odd numbers
     Failure/Error: series('lucas', 7).should eq 18
       
       expected: 18
            got: 13
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:30:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) series handles lucas series for even numbers
     Failure/Error: series('lucas', 8).should eq 29
       
       expected: 29
            got: 21
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:35:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) series handles lucas series for bigger numbers
     Failure/Error: series('lucas', 15).should eq 843
       
       expected: 843
            got: 610
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:40:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) series handles summed series for odd numbers
     Failure/Error: series('summed', 7).should eq 31
       
       expected: 31
            got: 26
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:50:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) series handles summed series for even numbers
     Failure/Error: series('summed', 8).should eq 50
       
       expected: 50
            got: 42
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:55:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) series handles summed series for bigger numbers
     Failure/Error: series('summed', 15).should eq 1453
       
       expected: 1453
            got: 1220
       
       (compared using ==)
     # /tmp/d20141023-2426-d89xk4/spec.rb:60:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01935 seconds
12 examples, 6 failures

Failed examples:

rspec /tmp/d20141023-2426-d89xk4/spec.rb:29 # series handles lucas series for odd numbers
rspec /tmp/d20141023-2426-d89xk4/spec.rb:34 # series handles lucas series for even numbers
rspec /tmp/d20141023-2426-d89xk4/spec.rb:39 # series handles lucas series for bigger numbers
rspec /tmp/d20141023-2426-d89xk4/spec.rb:49 # series handles summed series for odd numbers
rspec /tmp/d20141023-2426-d89xk4/spec.rb:54 # series handles summed series for even numbers
rspec /tmp/d20141023-2426-d89xk4/spec.rb:59 # series handles summed series for bigger numbers

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

Костадин обнови решението на 15.10.2014 12:33 (преди над 9 години)

+def fibonacci(index)
+ if index < 2
+ index
+ else
+ fibonacci(index-1) + fibonacci(index-2)
+ end
+end
+
+def lucas(index)
+ if index == 1
+ 2
+ elsif index == 2
+ 1
+ else
+ fibonacci(index-1) + fibonacci(index-2)
+ end
+end
+
+def series(summed, index)
+ if summed == "summed" then return fibonacci(index) + lucas(index) end
+ if summed == "fibonacci" then return fibonacci(index) end
+ if summed == "lucas" then return lucas(index) end
+end

Малко бележки:

  • Трябва да има интервали около "операторите" като <=, -, +, ?, ==, : и т.н.
  • Името на параметъра summed е много лошо избрано. По-добре е да се казва sequence_type или нещо такова. Но summed не е . Крайно подвеждащо е така.
  • Стила на if-овете в series не е добър. Едноредови if-ове с then почти никога не се ползват. Направи го с многоредово if-elsif-elsif-end клауза, или с постфиксен вариант на if, или по друг начин, но не го оставяй така.
  • Принципно е добре да се придържаш към низове с единични кавички, освен ако не използваш специалните свойства на низ с двойни кавички (например, интерполация)

Останалата част от задачата ти е прилична.

Здравейте,

Може ли да ми обясните какъв е правилният начин да си оправя решението? Общо взето каква е процедурата?

Малко коментари на вашите коментари:

  1. Винаги пиша такива спейсове, този път бързах, и съм ги забравил. Което е оправдание.

  2. Съгласен.

  3. Може ли да обясните защо не се ползват подобен тип "if"-ве? Първоначално го бях направил, така, както предлагате Вие, но редовете излязоха повече и реших да ползвам едноредови.

  4. Ясно. Ще се придържам.

Поздрави, Костадин

Ако съм ти разбрал правилно въпроса, решението можеш да си коригираш, докато не е изтекъл срокът на задачата. Преди крайния срок можеш да предаваш неограничен брой версии на решението ти. Само последната се зачита.

След изтичане на срока на задачата, предаването на решения затваря.

Когато предадеш по-рано решение, ще е по-голяма вероятността да получиш коментар от нас навреме и да имаш време да го отразиш в срок.

Относно въпроса ти в трета точка, if-then не се ползва принципно, понеже съществуват по-експресивни и прости начини да се постигне същото, а именно:

  • postfix-ни условия
  • нормален if-elsif-else

И двете стават. В твоя случай, постфиксният синтаксис щеше да изглежда така (подравнил съм if-клаузите за четимост):

def series(summed, index)
  return fibonacci(index) + lucas(index) if summed == "summed"
  return fibonacci(index)                if summed == "fibonacci" 
  return lucas(index)                    if summed == "lucas"
end

Нормалният if-else е дори още по-прост и лесно разбираем и аз бих го предпочел в този случай. А най-добре е case, но за него не сме говорили все още, затова не го изискваме.

Прегледай решенията на колегите си за още идеи. На лекцията днес също ще направим един бърз преглед на лоши и добри решения.