Михаил обнови решението на 14.12.2011 19:28 (преди около 13 години)
Като цяло, решението ти е прилично и вероятно ще мине почти всички тестове :) Само няколко дребни неща:
- Ако не гониш всяка микросекунда производителност, ползвай
+=
, вместоArray#concat
- На втория ред от
#next_generation
може (трябва) да ползвашeach
, а неmap
- Би трябвало да получиш метода
#count
наготово отEnumerable
- В
each
не присвоявай блока на променлива; направо го викай сyield
-- по-бързо е и се ползва по-често така; блока се присвоява на променлива само ако трябва да го подадеш на друга функция, която на свой ред евентуално да го вика
цц кои тестове няма да мина :P. Нали няма тестове за скорост защо съм убеден че сложноста е нещо от вида на O(n^5)
и към 1000 (живи) клетки ще започне да мисли :). Иначе промених някои неща.
- съгласен.
- map е останал от предишното решение (което не работеше)
- кой да се сети :)
- реших че все пак ще го предавам на друга функция :)
Въпрос: Enumerable#count
от each ли разбира че има n елемента ? защото ако е така ще го върна обратно че поне да не е толкова бавно :) не мисля че е особедно трудно да се разбере какво съм имал предвид и един ред :)
Не, няма тестове за скорост :)
Също така не съм пускал тестовете и не се наемам да кажа какво ще минеш и какво не :) Но това не е най-важното :)
Така за each
е по-добре. Само def each(&block)
, след като слагаш скоби и около другите дефиниции на методи с аргументи (и без интервал преди отварящата скоба — possible_neighbors (...
:)
Относно Enumerable#count
, в документацията пише как брои. С две думи, ако имаш #size
, ще ползва него, иначе ще ги обходи. Само че #count
има и допълнителни фийчъри, като например "колко пъти се среща даден елемент" или "за колко елемента блокът, подаден на #count
, връща истина`. Според мен, те винаги минават през обхождане.
вече нямам проблеми със скоростта. В случай че не може да ползваме set
ще се забави около 5 пъти но няма да умре на 100 поколение :).
някакви други забележки и си търся другo име за possible_neighbors
беше просто neighbors
, но така next_generation
изглежда малко ... странно
Ако ти харесва, пробвай да прекръстиш possible_neighbours
на neighbours_of
. На мен ми допадат този тип имена.
Това е гадно: if (block_given?)
. Тези скоби са абсолютно излишни. Нямам идея защо си ги сложил. Също нямам идея защо си усложнил така този each
. each
не би следвало да работи без блок, да се хвърли грешка в такъв случай би било окей, според мен.
Добре, но не смятам, че е необходимо. Задачата не е да направим нещо, което прилича на Array
, а по-скоро на Enumerable
. Там не се споменава нищо подобно и смятам, че може да се интерпретира и така, след като би опростило кода.
Иначе няма проблем да го оставиш и в твоя вариант. Аз бих предавал блок надолу, както беше го направил първоначално. Много малко по-бавно е.
ooooooooooooops имам един space дето не ми трябва ...... трябва да започна да ползвам %s за преименуването на методи ...