Напишите два прямоугольных блока кода, каждый шириной w и высотой h символов, которые реализуют игру жизни Конвея, когда они расположены в виде сетки. ( w и h могут быть любыми положительными целыми числами)
Например, два кодовых блока могут быть: ( w = 3, h = 2, не фактический код)
XX|
--+
а также
|
--+
Относитесь к первому блоку, как к «живой» ячейке в игре «Жизнь», а ко второму блоку - как к «мертвой».
Теперь расположите несколько копий этих двух блоков в большую программу, которая представляет сетку Game of Life, такую как этот планер :
| | | | |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX|XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Теперь вот ключевой момент: когда этот код запускается, на выходе должна быть сетка Game of Life, которая является поколением после этого, с использованием одинаковых блоков живого и мертвого кода для ячеек.
Таким образом, выводом для программы выше будет следующее поколение планера, который также служит исполняемой программой:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Запуск этого приведет к следующему поколению:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
И так далее.
Процесс должен быть бесконечно повторяемым и работать для любого расположения ваших живых и мертвых блоков кода в сетке Game of Life.
Выходная сетка должна иметь те же размеры, что и программа, из которой она вышла (5 на 6 выше). Размеры сетки от 1 до 1 должны работать, и они могут быть сколь угодно большими. Естественно, пустая сетка просто выдаст себя.
Обновление: было бы идеально иметь возможность имитировать сетки любых размеров без необходимости менять «плитки», но, поскольку это кажется очень сложным, я приму ответы, которые предполагают, что сетка имеет определенный размер (возможно, около 16 * 16).
Правила игры в жизнь таковы:
- Любая живая клетка с менее чем 2 или более чем 3 живыми ( Мур ) соседями умирает.
- Любая мертвая клетка с ровно 3 живыми соседями оживает.
- Другие клетки не меняются.
счет
Задача состоит в том, чтобы сделать это в наименьшей возможной области кодового блока. Ваш счет w * h . Самый низкий балл побеждает. В случае ничьих победит ответ, получивший наибольшее количество голосов.
Детали
- Помимо символов новой строки, необходимых для того, чтобы сделать вещи прямоугольными, ваши два кодовых блока (и, следовательно, ваши программы-гриды Game of Life) должны содержать только печатные символы ASCII (шестнадцатеричные коды от 20 до 7E, без вкладок, без дополнительных символов новой строки ).
- Оба кодовых блока должны иметь ровно w * h символов (помимо необходимых новых строк) с разницей как минимум в один символ. Заполнение их пробелами или комментариями - это хорошо. Они не должны меняться от одного поколения к другому.
- Вывод должен идти либо в файл, либо в стандартный вывод. Там нет ввода.
- Граничные условия могут быть либо периодическими (где верхний край ограничивает нижний, а левый край ограничивает правый), либо бесконечными (где все недопустимые ячейки всегда мертвы). Выберите то, что подходит вам больше всего.
- Чтение свой собственный исходный код не допускается.
- Любой язык или инструмент, который уже делает это, не допускается. (На всякий случай, если таковой существует.)
Примечание. Приведенные -|+
выше символы использовались только для выделения границ ячейки. Ваши блоки не нуждаются в различимой границе. Однако при отображении вашего вывода было бы полезно, если бы было какое-то различимое разделение между блоками, возможно, сделанное с символом, который никогда не использовался в программе, поэтому его легко удалить. например
DD+DD+DD+DD
+++++++++++
AA+DD+AA+DD
вместо того
DDDDDDDD
AADDAADD
источник
__SOURCE_CODE__
.Ответы:
Perl, w * h = 233 * 1 = 233 (на ячейку)
Ячейки работают с любым размером сетки (фактически даже с неправильной длиной строки). Вне границ клетки считаются мертвыми.
Мертвая клетка
Живая клетка
Планер
генерирует:
Пояснение (не актуально)
Perl, w * h = 140 * 2 = 280 (на ячейку)
Многолинейная ячейка неэффективна, но может устранить
__LINE__
.Мертвая клетка
Живая клетка
источник
JavaScript ES6 (239 x 1 символ на ячейку)
Мертвая клетка:
Живая клетка:
Разница только
S[j]=0
для мертвых иS[j]=1
живых клеток.Размер сетки контролируется переменными W (ширина) и H (высота). Клетки вне сетки мертвы.
Комментируемая версия
Планер (5 х 6 сетка)
Выходы следующего поколения:
источник
|
является побитовым оператором и работает только с числами.||
является логическим оператором, который возвращает левую сторону, если это «верно», в противном случае правая сторона.Python, 67x33 = 2,211
Обратите внимание, что это моя красивая версия, где я добавил строку «#» для каждой другой строки в ячейке жизни и «» для каждой другой строки в мертвой ячейке. Кроме того, ячейки разделены линиями "#". Таким образом, вы можете поместить начальную конфигурацию в текстовый файл, например
GOL.py
, и посмотреть на него крошечным шрифтом, чтобы увидеть, что происходит на каждом шаге. Чтобы перейти к следующему шагу, выполнитеpython GOL.py > GOL1.py;mv GOL1.py GOL.py
и посмотрите еще раз.Мое решение работает на сетке произвольного размера и предполагает периодические граничные условия. Я не тестировал переменную ширину линии, но определенно есть возможность для этого.
Я должен также упомянуть, что успех этого решения зависит от
__del__
того, когдаa
вызывается, когда уничтожается в конце программы. Документация Python гласитТак что я просто надеюсь, что это работает не только с моим переводчиком.
Живая клетка:
Мертвая клетка:
Python, 67x17 = 1,139 Чтобы получить версию для гольфа, в которой еще есть какой-то способ распознавания жизненных ячеек издалека, второе оператор печати в строках 19 и 31, а также все остальные строки удаляются.
Живая клетка:
Мертвая клетка:
Если есть спрос, я с удовольствием объясню внутреннюю работу моего решения, когда найду время.
источник
<sup><sub>...</sub></sup>
в<pre><code>
блоке. Это не уменьшает высоту строки, но шрифт текста уменьшается для каждого вхождения. Использование только нижнего или только верхнего индекса заставит код плавать вниз или вверх вне разметки, но чередование будет держать его по центру по вертикали.