编写可以创建仿射形的最小程序。您可以使用任何会产生与以下规则相同的结果的方法。您不必使用建议方法中的任何想法!
您的程序将有两个输入,第一个输入以074
从0到7的三位数组成的格式定义模式。第二个输入将定义大小,3
将为8x8,4
将为16x16,依此类推(2 ^ n)。您的程序必须为从0(1x1)到至少5(32x32)的所有大小输出正确的结果。如果它为更高的数字生成任何输出,则它必须是正确的,即,它必须在达到一定大小之前生成正确的输出,但是如果出现错误,则不会生成超出该大小的输出。您可能会假定最大大小为15(32768x32768),因为对于ASCII艺术作品(1GB)而言,这已经是疯狂的大小!
8x8模式将如下所示(规则160
)。最左边的数字代表Block A
,中间的数字代表Block (请不要粗鲁!),B
最右边的数字代表Block 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
都会产生Sierpinski三角形(8个不同的规则)。
您可以选择发布您喜欢的模式及其生成规则。如果这样做,请确保大小至少为3(8x8),以将其与类似规则区分开。