Ви вводите як вхідне зображення в градаціях сірого. Ваше завдання - знайти статичний або циклічний візерунок у грі життя Конвей, який максимально нагадує вхідне зображення.
Вихід може бути або нерухомим зображенням, або циклічною анімацією в якомусь форматі, який можна перетворити на gif. Розміри вихідного зображення повинні бути такими ж, як і вхідні, і вони повинні містити лише чорні та білі пікселі.
Якщо вихід є анімацією, кожен кадр повинен бути згенерований з попереднього відповідно до правил гри життя, з однією коміркою на піксель. Анімація повинна циклічно, при цьому перший кадр генерується з останнього кадру за тими ж правилами.
Якщо висновок - це нерухоме зображення, застосовуючи до нього правила ігрового життя, потрібно створити те саме зображення. Це означає, що жодна «жива» клітина не може мати більше трьох або менше двох «живих» сусідів, і жодна «мертва» клітина не може мати рівно трьох «живих» сусідів. (Зауважте, що це в основному те саме, що анімація, як описано вище, але лише з одним кадром.)
Додаткові правила та пояснення:
Ви (або ваша програма) можете вибрати, чи "живі" клітини представлені як білі, а "мертві" як чорні, чи навпаки. Тобто ви можете або жорсткий код цього, або ваша програма може вибрати його на основі вхідного зображення. (Але він повинен бути однаковим для кожного кадру анімації.)
Прикордонні умови повинні бути періодичними, тобто клітини на правому стовпчику мають сусіди по крайньому лівому стовпчику тощо.
Для анімації частота кадрів залежить від вас (або вашої програми); Я думаю, швидка швидкість кадрів буде добре працювати для наближення сірих пікселів.
Будь ласка, опублікуйте принаймні два результати, вбудовані у вашу відповідь. Якщо ви можете опублікувати результати з усіх вхідних зображень нижче, бажано.
Припустимо зменшити масштаб тестових зображень, якщо це необхідно для досягнення 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)
Ось кілька результатів із прикладу коду. Я впевнений, що можливі набагато кращі результати.