Решение на Първа задача от Димитър Мутаров

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

Към профила на Димитър Мутаров

Резултати

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

Код

def calculate_sequence(number, first_member, second_member)
(number-2).times{
temp = second_member + first_member
first_member = second_member
second_member = temp}
second_member
end
def fibonacci(number)
first_member, second_member = 1,1
calculate_sequence(number, first_member, second_member)
end
def lucas(number)
first_member, second_member = 2,1
case number
when 1 then 2
when 2 then 1
else calculate_sequence(number, first_member, second_member)
end
end
def summed(number)
fibonacci(number) + lucas(number)
end
def series(series, number)
case series
when 'fibonacci' then fibonacci(number)
when 'lucas' then lucas(number)
when 'summed' then summed(number)
end
end

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

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

Finished in 0.00959 seconds
12 examples, 0 failures

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

Димитър обнови решението на 09.10.2014 02:04 (преди над 9 години)

+#Нещо неможах да подкарам skeptic на windows
+#Утре ще го мъча и ако нещо не мине ще обновя поста :D
+
+# Fibonacci
+def fib(n)
+ n <= 1 ? n : fib( n - 1 ) + fib( n - 2 )
+end
+
+# Lucas
+def lucas(n)
+ n <= 2 ? n == 1 ? 2 : 1 : lucas(n-1) + lucas(n-2)
+end
+
+#Summed S(n) = F(n) + L(n)
+def summed(n)
+ fib(n) + lucas(n)
+end
+
+def series(type, value)
+ case type
+ when 'fibonacci' then fib(value)
+ when 'lucas' then lucas(value)
+ when 'summed' then summed(value)
+ else "Invalid type"
+ end
+end

Миналата година също имаше подобни проблеми със skeptic заради spell check-a. Моля сподели във форумите проблема, за да се опитаме да го разрешим.

  • Избягвай фиктивни коментари
  • Имаш проблеми с whitespaces. Прочети style guide-ът.
  • Използваш вложен тернарен оператор, което не е ok.
  • Заслужаваше ли си съкращението до fib?
  • Малко си увеличил дефиниционното множество на нашия fibonacci.
  • Не се грижи за невалидните случаи.
  • Дали сериите на Фибоначи и Лукас са тип серии или конкретни серии?

Ако адресираш горните точки решението ти ще е супер.

Мерси за feedback-а. Днес след работа ще гледам да пусна тема за skeptic със screenshot-и, а иначе сега видях какво съм написал снощи с тернарния оператор и "fib", и се извинявам от мързел е било. Ще гледам да оправя нещата в следващите дни :]

Иначе имам само няколко въпроса:
- Какво имаш в предвид, че съм разширил множеството на фибоначи ?
- По последната точка във условието пишеше, че се изцикля типа на редът затова съм писал type. Може ли да ми обясниш какво имаш в предвид, защото нещо не разбрах.


Мерси отново

  • Какво имаш в предвид, че съм разширил множеството на фибоначи ?

Според условието ни:

F(1) = 1 F(2) = 1 F(3) = 2 F(4) = 3 ...

Решението ти разчита на факта, че fib(0) == 0, без него няма как да се изчисли fib(2) или за което и да е по-голямо число. Не, не е фатално и няма да тестваме за подобна стойност. Но в общия случай е объркващо да използваш зависимост, която по дефиниция не съществува.

  • По последната точка във условието пишеше, че се изцикля типа на редът затова съм писал type. Може ли да ми обясниш какво имаш в предвид, защото нещо не разбрах.

fibonacci, lucas и summed са имена на редове. Напълно си прав, ние сме в грешка с условието и трябва да го поправим.

Димитър обнови решението на 09.10.2014 23:34 (преди над 9 години)

-#Нещо неможах да подкарам skeptic на windows
-#Утре ще го мъча и ако нещо не мине ще обновя поста :D
-
-# Fibonacci
-def fib(n)
- n <= 1 ? n : fib( n - 1 ) + fib( n - 2 )
+def fibonacci(number)
+ number <= 2 ? 1 : fibonacci( number - 1 ) + fibonacci( number - 2 )
end
-# Lucas
-def lucas(n)
- n <= 2 ? n == 1 ? 2 : 1 : lucas(n-1) + lucas(n-2)
+def lucas(number)
+ if number <= 2
+ if number == 1 then 2
+ else 1
+ end
+ else lucas(number-1) + lucas(number-2)
+ end
end
-#Summed S(n) = F(n) + L(n)
-def summed(n)
- fib(n) + lucas(n)
+def summed(number)
+ fibonacci(number) + lucas(number)
end
-def series(type, value)
- case type
- when 'fibonacci' then fib(value)
- when 'lucas' then lucas(value)
- when 'summed' then summed(value)
- else "Invalid type"
- end
+def series(series, value)
+ case series
+ when 'fibonacci' then fibonacci(value)
+ when 'lucas' then lucas(value)
+ when 'summed' then summed(value)
+ end
end

Здрасти, обнових решението си и си постнах проблема със skeptic - надявам се да съм покрил точките от обратната връзка по задачата и проблема, който съм описал в поста за skeptic да не е крайно малоумен, и просто да не довиждам нещо в съобщението с грешката :D

Мерси много !

Между другото тия проблеми със whitespace's - не знам защо, но си reindent-вам кода в sublime(като настройките съм ги взел от 1 тема във форума за настройка на sublime Настройки) и копирам в полето за предаване то си слага някакви табове, където си иска. Да не би да има някакви настройки, които трябва да си направя ?

Димитър обнови решението на 10.10.2014 11:09 (преди над 9 години)

def fibonacci(number)
- number <= 2 ? 1 : fibonacci( number - 1 ) + fibonacci( number - 2 )
+ number <= 2 ? 1 : fibonacci(number - 1) + fibonacci(number - 2)
end
def lucas(number)
if number <= 2
if number == 1 then 2
else 1
end
else lucas(number-1) + lucas(number-2)
end
end
def summed(number)
fibonacci(number) + lucas(number)
end
def series(series, value)
case series
- when 'fibonacci' then fibonacci(value)
- when 'lucas' then lucas(value)
- when 'summed' then summed(value)
+ when 'fibonacci' then fibonacci(value)
+ when 'lucas' then lucas(value)
+ when 'summed' then summed(value)
end
end

Димитър обнови решението на 10.10.2014 11:18 (преди над 9 години)

def fibonacci(number)
number <= 2 ? 1 : fibonacci(number - 1) + fibonacci(number - 2)
end
def lucas(number)
- if number <= 2
- if number == 1 then 2
- else 1
- end
- else lucas(number-1) + lucas(number-2)
+ case number
+ when 1 then 2
+ when 2 then 1
+ else lucas(number-1) + lucas(number-2)
end
end
def summed(number)
fibonacci(number) + lucas(number)
end
def series(series, value)
case series
when 'fibonacci' then fibonacci(value)
when 'lucas' then lucas(value)
when 'summed' then summed(value)
end
end

Лукас го мислих по няколко начина -> с if,elsif,else || switch || вложени ифове, но не знам кое е най-бързо като изпълнение затова ги пробвам - ако switch-а е бавен в Ruby ще го пусна с if/elsif/else.

Мерси отново за feedback-a

Може да приемеш, че няма разлика между двете. Това да използваш една конструкция вместо друга, когато първата е била по-подходяща е вид микро оптимизация. Освен ако не пишеш ядро на ОС или драйвери за видео карта има един единствен случай, когато е приемливо. Вече си написал кода по "нормалния" начин и си го пуснал в употреба. За жалост получаваш емпирично доказателство, че така върви прекалено бавно, идентифицирал си, че bottleneck-ът е точно нещото, което си на път да микрооптимизираш и си напълно сигурен, че не съществува друг начин да го оптимизираш. Тук е точно обратното. Решението ти е дървовидна рекурсия, което е едно от най-бавните неща, които могат да се срещнат на практика. Може да се докара до линейна сложност чрез мемоизация. По принцип задачите за fibonacci и lucas (а от там и за summed) имат константно решение. Ако не разбираш нещо от горните, моля повдигни въпроса утре на по бира или понеделник преди лекцията. Още няколко души коментираха в подобна насока и ще бъде изключително полезно за всички, ако го обясним. Но отново - не държим на оптималност, недей да си пренаписваш цялото решение само за това.

  • value е доста generic име. Общо взето всяка променлива може да се кръсти value. Бъди малко по-конкретен. Какво значение има тази стойност в дадения случай.
  • Прилежно е да подравняваш някои конструкции, когато се срещат на съседни редове. Сред тях са =, then и стойностите на hash-овете.

Димитър обнови решението на 15.10.2014 11:36 (преди над 9 години)

+def calculate_sequence(number, first_member, second_member)
+ (number-2).times{
+ temp = second_member + first_member
+ first_member = second_member
+ second_member = temp}
+ second_member
+end
+
def fibonacci(number)
- number <= 2 ? 1 : fibonacci(number - 1) + fibonacci(number - 2)
+ first_member, second_member = 1,1
+ calculate_sequence(number, first_member, second_member)
end
def lucas(number)
+ first_member, second_member = 2,1
case number
when 1 then 2
when 2 then 1
- else lucas(number-1) + lucas(number-2)
+ else calculate_sequence(number, first_member, second_member)
end
end
def summed(number)
fibonacci(number) + lucas(number)
end
-def series(series, value)
+def series(series, number)
case series
- when 'fibonacci' then fibonacci(value)
- when 'lucas' then lucas(value)
- when 'summed' then summed(value)
+ when 'fibonacci' then fibonacci(number)
+ when 'lucas' then lucas(number)
+ when 'summed' then summed(number)
end
end

Знам,че дървото се увеличава прогресивно като е рекурсия, но пак от мързел ги правих така. Последните дни гледах един метод .times, но не го разбирам напълно затова не исках да го ползвам. Надявам се така решението да е ок, а по нататък да схвана синтаксиса на Ruby, защото е трудно със методи от C#(на който пиша) да се пишат задачи на Ruby :D Мерси отново за feedback-а ;]

И между другото съм болен от 1 седмица и няма да мога да дойда на по бира, но от другата седмица пак ще гледам да съм редовен :D

Димитър обнови решението на 15.10.2014 11:58 (преди над 9 години)

def calculate_sequence(number, first_member, second_member)
(number-2).times{
temp = second_member + first_member
- first_member = second_member
+ first_member = second_member
second_member = temp}
second_member
end
def fibonacci(number)
first_member, second_member = 1,1
calculate_sequence(number, first_member, second_member)
end
def lucas(number)
first_member, second_member = 2,1
case number
when 1 then 2
when 2 then 1
else calculate_sequence(number, first_member, second_member)
end
end
def summed(number)
fibonacci(number) + lucas(number)
end
def series(series, number)
case series
- when 'fibonacci' then fibonacci(number)
- when 'lucas' then lucas(number)
- when 'summed' then summed(number)
+ when 'fibonacci' then fibonacci(number)
+ when 'lucas' then lucas(number)
+ when 'summed' then summed(number)
end
end