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

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

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

Резултати

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

Код

def sequence_member(sequence, index)
index.times do
sequence << sequence[-2] + sequence[-1]
end
sequence.shift(index).last
end
def summed_sequence_member(index)
sequence_member([1, 1], index) + sequence_member([2, 1], index)
end
def series(sequence_name, index)
case sequence_name
when "fibonacci" then sequence_member([1, 1], index)
when "lucas" then sequence_member([2, 1], index)
when "summed" then summed_sequence_member(index)
end
end

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

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

Finished in 0.0095 seconds
12 examples, 0 failures

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

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

+def sequence_member(previous, current, index)
+ sequence_array = [previous, current]
+ index.times do
+ previous, current = current, previous + current
+ sequence_array << current
+ end
+ sequence_array[index - 1]
+end
+
+def fibonacci(index)
+ sequence_member(1, 1, index)
+end
+
+def lucas(index)
+ sequence_member(2, 1, index)
+end
+
+def summed(index)
+ fibonacci(index) + lucas(index)
+end
+
+def series(generator_type, index)
+ send generator_type.to_sym, index
+end
  • Супер е, че си разгледал и видял send. Все пак очаквахме да използвате базови инструменти за базова задача. Ако отсега метапрограмираме се чудя какво ще стане със следващите задачи. :) Използван в глобалния контекст може да има пагубни последствия ако не си напълно наясно как работи. Още една малка забележка - send може да приема и string-ове, не е нужно да cast-ваш експлицитно към символ.
  • Имплементацията ти на sequence_member е доста процедурна. Кога множественото присвояване на един ред е ok е малко fuzzy. Също съм убеден, че ще успееш да намериш по-красиви алтернативи за често използвани операции като получаване на последния елемент на масив. Погледни документацията на Enumerable и Array, за да почерпиш вдъхновение :)
  • Какво всъщност трябва да значи generator_type?

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

-def sequence_member(previous, current, index)
- sequence_array = [previous, current]
- index.times do
- previous, current = current, previous + current
- sequence_array << current
+def sequence_member(sequence, index)
+ if index > 2
+ (index-2).times do
+ sequence << sequence[-2] + sequence[-1]
+ end
+ return sequence.last
+ else
+ sequence[index-1]
end
- sequence_array[index - 1]
end
-def fibonacci(index)
- sequence_member(1, 1, index)
+def summed_sequence(index)
+ sequence_member([1, 1], index) + sequence_member([2, 1], index)
end
-def lucas(index)
- sequence_member(2, 1, index)
-end
-
-def summed(index)
- fibonacci(index) + lucas(index)
-end
-
-def series(generator_type, index)
- send generator_type.to_sym, index
+def series(sequence_type, index)
+ case sequence_type
+ when "fibonacci" then return sequence_member([1, 1], index)
+ when "lucas" then return sequence_member([2, 1], index)
+ when "summed" then return summed_sequence(index)
+ end
end

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

def sequence_member(sequence, index)
if index > 2
(index-2).times do
sequence << sequence[-2] + sequence[-1]
end
return sequence.last
else
sequence[index-1]
end
end
-def summed_sequence(index)
+def summed_sequence_member(index)
sequence_member([1, 1], index) + sequence_member([2, 1], index)
end
def series(sequence_type, index)
case sequence_type
when "fibonacci" then return sequence_member([1, 1], index)
when "lucas" then return sequence_member([2, 1], index)
- when "summed" then return summed_sequence(index)
+ when "summed" then return summed_sequence_member(index)
end
end
  • generator_type трябва да е sequendce_type, мисля че звучи по-разбираемо.
  • Метапрограмирането го разкарах, взе че стана и по-кратко решението.
  • sequence_member е променена, но все пак ме дразни, че променям параметъра sequence. И все пак, ОК ли е такъв подход?
  • Имаш лек whitespace проблем. Можеш да разгледаш style guide-a, ако не го виждаш.
  • Премахни абсолютно всички return-и в кода си. case и if - elsif - else се оценяват до оценката на изпълнението на последния израз в match-налата клауза.
  • Предпочитай ясни пред по-хитроумни или кратки решения. sequence[index-1] не е моментално очевидно какво прави.
  • Ами не, принципно не е ok. :) Но ако предположим, че единствено series ще е присъства в публичния ти интерфейс и другите ще ги скриеш е малко borderline.
  • fibonacci и lucas всъщност са имена на, а не типове редици. Това беше наша грешка в първоначалното условие, поправихме се.

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

def sequence_member(sequence, index)
- if index > 2
- (index-2).times do
- sequence << sequence[-2] + sequence[-1]
- end
- return sequence.last
- else
- sequence[index-1]
+ index.times do
+ sequence << sequence[-2] + sequence[-1]
end
+ sequence.shift(index).last
end
def summed_sequence_member(index)
sequence_member([1, 1], index) + sequence_member([2, 1], index)
end
-def series(sequence_type, index)
- case sequence_type
- when "fibonacci" then return sequence_member([1, 1], index)
- when "lucas" then return sequence_member([2, 1], index)
- when "summed" then return summed_sequence_member(index)
+def series(sequence_name, index)
+ case sequence_name
+ when "fibonacci" then sequence_member([1, 1], index)
+ when "lucas" then sequence_member([2, 1], index)
+ when "summed" then summed_sequence_member(index)
end
end