В качестве входных данных вы получаете изображение в оттенках серого. Ваша задача - найти в игре «Жизнь» Конвея статический или зацикленный узор, максимально приближенный к исходному изображению.
Ваш вывод может быть либо неподвижным изображением, либо цикличной анимацией в каком-либо формате, который можно преобразовать в gif. Размеры выходного изображения должны совпадать с размерами входных данных и содержать только черные и белые пиксели.
Если выходные данные являются анимацией, каждый кадр должен быть сгенерирован из предыдущего в соответствии с правилами игры жизни, с одной ячейкой на пиксель. Анимация должна зацикливаться, причем первый кадр генерируется из последнего кадра по тем же правилам.
Если вывод является неподвижным изображением, применение правил игры жизни должно привести к тому же самому изображению. Это означает, что ни в одной «живой» ячейке не может быть более трех или менее двух «живых» соседей, а в «мертвой» ячейке не может быть ровно три «живых» соседа. (Обратите внимание, что это в основном то же самое, что и анимация, как описано выше, но только с одним кадром.)
Дополнительные правила и разъяснения:
Вы (или ваша программа) можете выбрать, будут ли «живые» клетки представлены белыми, а «мертвые» - черными или наоборот. То есть вы можете либо жестко закодировать это, либо ваша программа может выбрать его на основе входного изображения. (Но это должно быть одинаковым для каждого кадра анимации.)
Граничные условия должны быть периодическими, то есть ячейки в крайнем правом столбце имеют соседей в крайнем левом столбце и т. Д.
Для анимации частота кадров зависит от вас (или вашей программы); Я полагаю, что высокая скорость кадров будет хорошо работать для аппроксимации серых пикселей.
Пожалуйста, опубликуйте в своем ответе как минимум два результата. Если вы можете публиковать результаты из всех входных изображений ниже, это предпочтительно.
Допустимо уменьшать размер тестовых изображений, если это необходимо для получения картинок с достаточно маленьким размером файла. Если вы хотите сделать ссылку и на файлы большего размера, это нормально. Если вы хотите похвастаться, не стесняйтесь найти некоторые исходные файлы с более высоким разрешением.
Пожалуйста, постарайтесь избегать слишком большого количества контролируемых параметров в вашем коде - лучше всего, если ваша программа использует только изображение. Исключение составляют случаи, когда вы хотите иметь параметр для управления количеством кадров анимации, так как это повлияет на размер файла.
Вы можете использовать внешние программы, чтобы изменить формат входных и выходных файлов и / или скомпилировать выходные кадры в анимацию, если хотите. (Это не проблема обработки формата файла.)
Это конкурс популярности , поэтому победит ответ с наибольшим количеством голосов.
Вот подборка тестовых изображений, в основном взятых из других вопросов на этом сайте. (Возможно, я добавлю дополнительные «бонусные» входные изображения позже.)
Просто для начала, вот очень глупая попытка ссылки в Python 2, в которой используется тот факт, что блок из четырех квадратов является стабильной структурой в игре жизни. Он просто изменяет масштаб входного изображения в 4 раза, а затем рисует блок, если соответствующий пиксель темнее, чем 0,5.
from skimage import io
from skimage import transform
import sys
img = io.imread(sys.argv[1],as_grey=True)
source = transform.resize(img, [i/4 for i in img.shape])
img[:]=1
for x in xrange(source.shape[0]):
for y in xrange(source.shape[1]):
if source[x,y]<0.5:
img[x*4, y*4] = 0
img[x*4+1, y*4] = 0
img[x*4, y*4+1] = 0
img[x*4+1, y*4+1] = 0
io.imsave(sys.argv[2], img)
Вот некоторые выводы из примера кода. Я уверен, что гораздо лучшие результаты возможны.