Задача здесь состоит в том, чтобы прочитать из .rle
файла Golly или открытого текста (на ваш выбор), имя файла которого предоставлено (в STDIN или в качестве аргумента командной строки), и идентифицировать и подсчитать общие шаблоны в сетке, закодированной в них.
В качестве альтернативы вы можете выбрать, чтобы содержимое файла предоставлялось непосредственно через STDIN.
Ваша программа должна быть в состоянии идентифицировать и различать по крайней мере пятнадцать наиболее распространенных строгих натюрмортов и пять наиболее распространенных осцилляторов плюс планеры .
Все фазы этих генераторов должны быть распознаны, как и все четыре фазы планера.
Он должен вывести список, содержащий итоговое количество каждого шаблона, с именем и количеством каждого шаблона в отдельной строке. Ваша программа может включить в список выходных данных либо все эти шаблоны, либо только те, из которых хотя бы один был найден.
Шаблоны, которые являются частью других учитываемых шаблонов, не должны учитываться. (например, 8-элементная фаза маяка также не должна учитываться как два блока, а привязка корабля также не должна учитываться как два корабля)
Вы можете предположить, что вход уже стабилизировался и не содержит шаблонов, не входящих в упомянутый набор. Вы также можете предположить, что входная сетка поместится в поле 1024x1024.
Это код-гольф , поэтому выигрывает самая короткая программа.
Описание формата файла RLE
Файл RLE содержит закодированную сетку жизни с длиной цикла. Все строки, начинающиеся с, #
являются комментариями и должны игнорироваться.
Первая непустая строка без комментариев имеет вид x=<width>,y=<height>,rule=<rule>
. Для целей этой задачи правило всегда будет B3/S23
. Он может содержать пробелы, которые должны быть удалены перед обработкой этой строки (конечно, нет необходимости обрабатывать эту строку вообще.)
Строки без комментариев после первой должны рассматриваться как одна строка. Это должно состоять только из десятичных цифр, символов $
, b
и o
, и разрывов строк, и не будет заканчиваться цифрой. Разрывы строк следует игнорировать, но вы можете предположить, что разрывы строк не будут прерывать строки цифр.
Это может быть прекращено одним !
.
b
представляет мертвую клетку, o
представляет живую клетку и $
представляет конец строки. Любое десятичное число указывает на то, что следующий символ должен рассматриваться как повторяющийся столько раз.
Кодировка в виде простого текста
Другой вариант - прочитать шаблон в другом формате открытого текста, описанном здесь. В этом кодировании отключенные ячейки представлены дефисами, а в ячейках - прописными буквами, с символами новой строки, разделяющими строки.
Вы можете предположить, что все строки без комментариев будут дополнены до дефисов одинаковой длины.
Строки, начинающиеся с, !
являются комментариями и должны игнорироваться.
Некоторые тестовые случаи
УПИ:
#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!
Простой текст:
!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO
Результаты:
Glider 1
Blinker 4
Block 1
УПИ:
x = 27, y = 15, rule = B3/S23
5b2o$5b2o9$11bo$o9bobo$o9bobo$o10bo12b3o!
#Here's a comment at the end
Простой текст:
-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end
Результаты:
Block 1
Blinker 2
Beehive 1
УПИ:
#You may have multiple comments
#As shown here
x = 13, y = 11, rule = B3/S23
2o$2o2$12bo$12bo$12bo$2b2o$2b2o4b2o$7bo2bo$7bobo$8bo!
Простой текст:
!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----
Результаты:
Block 2
Blinker 1
Loaf 1
УПИ:
# Pentadecathlon
# Discovered by John Conway
# www.conwaylife.com/wiki/index.php?title=Pentadecathlon
x = 10, y = 3, rule = B3/S23
2bo4bo2b$2ob4ob2o$2bo4bo!
Простой текст:
! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--
Результаты:
Pentadecathlon 1
бонус
Если вы поддерживаете оба формата ввода (используя расширение файла [ .rle
для файлов rle и .cells
для открытого текста - как не нужно определять другие расширения) или флаг командной строки, чтобы различать их), вы можете вычесть 5% от вашей оценки.
источник
OOO.OO\n....OO
Ответы:
Haskell, 2417 байт
Это заняло много времени, и все еще есть несколько ошибок, но я получил несколько трюков, так что это того стоило.
Заметки:
Он сочетает в себе несколько ключевых идей:
Вот код:
Вот код Mathematica, используемый для упаковки массива 0,1 в формат, позже распакованный программой haskell:
Вот гораздо более полное раскрытие кода:
источник