Михаил обнови решението на 14.12.2011 19:28 (преди почти 14 години)
Като цяло, решението ти е прилично и вероятно ще мине почти всички тестове :) Само няколко дребни неща:
- Ако не гониш всяка микросекунда производителност, ползвай
+=, вместо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 за преименуването на методи ...
