Напишите самую маленькую программу для создания аффинных фракталов. Вы можете использовать любой метод, который, по вашему мнению, дает те же результаты, что и приведенные ниже правила. Вам не нужно использовать идеи из предложенных методов!
Ваша программа будет принимать два входа, первый для определения шаблона в формате, 074состоящем из трех цифр от 0 до 7. Второй вход будет определять размер, 3будет 8x8, 4будет 16x16 и т. Д. (2 ^ n). Ваша программа должна вывести правильный результат для всех размеров от 0 (1x1) до как минимум 5 (32x32). Если он выдает какой-либо вывод для больших чисел, он должен быть правильным, то есть он должен вырабатывать правильный вывод до определенного размера, но не производить вывод выше этого размера, если он будет неправильным. Вы можете принять максимальный размер 15 (32768x32768), поскольку это уже безумный размер для ASCII-графики (1 ГБ)!
Шаблон 8х8 будет выглядеть примерно так (правило 160). Самая левая цифра будет для блока A, средняя цифра (без грубых мыслей, пожалуйста!) Для блока Bи крайняя правая цифра для блока C. Чтобы построить фрактал, уменьшите его наполовину в обоих измерениях и примените правило вращения / зеркального отражения для блока. Чтобы уменьшить рисунок, разделите его равномерно на 2x2 области. В каждой области будет либо 3 видимых символа, либо ни одного. Если есть видимые символы, поместите символ в соответствующее место в меньшем блоке, в противном случае поместите пробел. Правила 0- 3не отражаются, правила 4- 7отражаются. Правила 0и 4не повернуты, 1а 5повернуты на 90 градусов по часовой стрелке, 2и6повернуты на 180 градусов 3и 7повернуты на 270 градусов по часовой стрелке. Сшить три блока вместе в указанном порядке, Aв верхнем левом углу, Bнижнем левом и Cнижнем правом.
AAA
AA A
AA
A
BBB CC
B BBC
BBCCC
B CCC
Сокращается, поворачивается и отражается по номеру правила:
0 1 2 3 4 5 6 7
---- ---- ---- ---- ---- ---- ---- ----
AA BAA CCB C C BCC AAB AA
A BB A CBB CC CC BBC A BB A
BBC CC A A BB BB A A CC CBB
BCC C AA AAB BAA AA C CCB
Правила:
- Не отражается, повернут на 90 градусов по часовой стрелке
- Не отражено, повернуто на 180 градусов по часовой стрелке
- Не отражено, повернуто на 270 градусов по часовой стрелке
- Зеркальный, но не повернутый
- Зеркальный, затем повернутый на 90 градусов по часовой стрелке
- Зеркальный, затем повернутый на 180 градусов по часовой стрелке
- Зеркальный, затем повернутый на 270 градусов по часовой стрелке
- Правило 0: не отражается, не вращается
Зеркалирование всегда выполняется первым и выполняется по диагонали через пустой угол, например, правило 0 против правила 4:
0 4
---- ----
AA / C /
A / CC/
BBC BB A
/BCC /BAA
Только правила 1, 6и 0используются в приведенном выше шаблоне, в этом порядке. После применения преобразований и сшивания блоков это будет выглядеть так, как показано ниже, за исключением того, что каждый блок разнесен на один интервал. В вашем коде не будет лишнего пространства. Если вы сравните его с «родительским» изображением, вы увидите, что оно имеет видимые символы в тех же позициях.
BAA
BB A
CC
C
AAB AA
A BB A
CC BBC
C BCC
Другой способ создания изображения без сжатия заключается в следующем: начните с одного символа:
X
Примените преобразования для каждого из трех блоков (ни одного, поскольку это всего лишь один символ) и объедините блоки:
X
XX
Примените преобразования для каждого из трех блоков снова:
1
--
XX
X
6 0
-- --
XX X
X XX
Сшить их вместе:
XX
X
XXX
XXX
Примените преобразования для каждого из трех блоков снова:
1
----
XXX
XX X
XX
X
6 0
---- ----
XXX XX
X XX X
XX XXX
X XXX
Сшить их вместе:
XXX
XX X
XX
X
XXX XX
X XXX
XXXXX
X XXX
Вы можете использовать любой печатный символ или символы (0x21 - 0x7E) для видимой части шаблона, но только пробел (0x20) для пробелов. Конечные пробелы разрешены, но за пределами квадрата не должно быть пробелов (т. Е. Для квадрата 8x8 не должно быть символов после столбца 8).
Существует 512 различных правил, но некоторые из них производят одинаковый шаблон. Как примечание стороны, любой образец, содержащий только 0и 4будет производить треугольник Серпинского (8 различных правил).
При желании вы можете опубликовать свой любимый шаблон и правило, которое его генерирует. Если вы это сделаете, убедитесь, что размер не менее 3 (8x8), чтобы отличить его от аналогичных правил.