Для проверки на полный квадрат есть всякие хитрости.
Например, глянуть на последние биты числа - квадраты кончаются не чем-попало.
Для последнего байта только 44 значения подходят (как-то писал такую проверку)
Yura Khlyan:
> метод in для проверки вхождения для списка самый быстрый.
Верно, но время на него растёт пропорционально длине списка.
Тем и хорош set, что для него время проверки вхождения элемента - константа.
Способ, конечно, есть, и не один. Это - домашнее задание )))
Перевод списка во множество не катит, так как можно изначально обходиться set'ом, как в том решении.
Перечитай вопросы. Придумаешь - напиши.
Yura Khlyan:
Про скобки: python не любит избыточных скобок, это unpythonic
Вопрос вот какой: если для хранения gen использовать list, можно ли что-нибудь придумать, чтобы избежать вот этого:
"суммарное время проверки будет расти как (число_живых_клеток)^2"
Yura Khlyan:
Неверно, в Python такой приоритет операций:
x or y and z == x or (y and z)
т.е. 3соседа или (4, но обязательно xy живая)
Неверно ((( Работать, конечно, будет,
но в условии присутствует проверка xy in gen
При росте числа клеток время этой проверки будет константным для set или dict,
но будет линейно расти на структурах типа list
Тогда суммарное время проверки будет расти как (число_живых_клеток)^2
Придумай структуру для ngh (соседей), которая решит эту поблему.
Yura Khlyan:
Так в этом условии и реализовано ))) (if cnt == 3 or blah-blah)
Следующий вопрос:
Для gen использован set(). Это обязательно? Какие есть варианты?
Yura Khlyan:
Не хотите - не надо, это просто упражнение на конверсию одного в другое.
Генераторы хороши и сложные.
Но в них нельзя завести временный промежуточный результат, который был бы неоднократно полезен.
Например [a**b for a,b in zip(aa, bb) if a**b != 256] - значение a**b хотелось бы вычислять однократно.
Попробуйте разобраться, как получилось, что условие (if cnt == 3 or cnt == 4 and xy in gen) эквивалентно вашему.
Yura Khlyan:
Отлично.
Counter - это вариант словаря, заточеный на подсчет.
В процедуру display() можно добавить вывод числа живых клеток - но на популяциях типа планера и проще она неизменна. Это большой плюс - ваша матрица растет как t^2
В теле цикла были реализованы генераторы структур.
Можете переписать то же самое в императивном стиле (всякие там add/append в цикле)?
Yura Khlyan:
Ваше решение я видел и понял, его можно улучшить, но не вижу смысла топтаться.
Мы не продвинемся дальше без ответов не простые вопросы:
"В этих строках использованы структуры данных. Какие"?
Добавился еще один:
"Что именно в них хранится"?
Обещаю, что, ответив шаг за шагом нв вопросы, вы прокачаете скилл )))
Yura Khlyan:
Если вы запускали вышепреведенный код, то , наверное, можете ответить на вопрос "Оно и должно расти, нет"?
Если еще не запускали - я за вас отвечу: необязательно. А всё же запустите.
В приведенном решении жизненный цикл популяции выписан в две строки (+ display() для наглядности).
В этих строках использованы структуры данных. Какие?
kahi4:
Схемы плавных генераторов имеют тот же недостаток, что и достоинство: частота чувствительна к внешним воздействиям, а, значит, склонна плыть. На промежутках в несколько (много) колебаний её можно удержать схемой автоподстройки частоты (к частоте хорошего генератора), но фаза будет вихлять.
Про плис не знаю.
egorsmkv:
Автор задал вопрос, как задал. Для гита ситуация отличается - у файлов правильные расширения, и отличить лисп от питона можно так. А если какой извращенец шифрует расширения - он сам себе буратино.