Напишите самую маленькую программу для создания аффинных фракталов. Вы можете использовать любой метод, который, по вашему мнению, дает те же результаты, что и приведенные ниже правила. Вам не нужно использовать идеи из предложенных методов!
Ваша программа будет принимать два входа, первый для определения шаблона в формате, 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), чтобы отличить его от аналогичных правил.