编写最小的程序,你可以创建仿射分形。您可以使用任何您认为可以产生与下面规则相同的结果的方法。您不必从建议的方法中使用任何想法!
您的程序将接受两个输入,第一个输入以从0到7的三位数字074格式定义模式,第二个输入将定义大小,3将为8x8,4将为16x16等等(2^n)。您的程序必须输出所有大小从0 (1x1)到至少5 (32x32)的正确结果。如果它为更高的数字产生任何输出,那么它必须是正确的,也就是说,它必须产生到一定大小的正确输出,但是如果它是错误的,则不产生超过该大小的输出。您可以假设最大大小为15 (32768x32768),因为对于ASCII art (1GB)来说,这已经是一个疯狂的大小了!
8x8模式如下所示(规则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 规则:
镜像总是先完成,然后通过空白角对角线进行,例如规则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),以区别于类似的规则。
https://codegolf.stackexchange.com/questions/50342
复制相似问题