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

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

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

Резултати

  • 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 (преди около 10 години)

+#Нещо неможах да подкарам 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 (преди около 10 години)

-#Нещо неможах да подкарам 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 (преди около 10 години)

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 (преди около 10 години)

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

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

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

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

+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 (преди около 10 години)

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