Python 3.5、703 695 676 648 587 581 542 535 500 486 462 431 423 411字节:
(感谢@flawr提供有关节省55个字节的建议(486-> 431)!)
def j(r):R=range;Z=zip;B=r+r+2;P,M='+-';X='| ';q=[*Z(R(0,B-1,2),R(B-1,0,-2))];L=r+1;A=2+r;print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))
冠军的争夺者不是很多,但我还是给了它一个机会,而且效果很好。我会尽量在可能的情况下随着时间的推移进一步缩短时间,但是就目前而言,我喜欢它并且不能更快乐。
在线尝试!(Ideone)(由于在线编译器存在明显的局限性,因此此处看起来可能有所不同。但是,它仍然非常相似。)
说明:
为了便于说明,我们假设上述函数是在输入r
等于的情况下执行的1
。话虽如此,基本上,逐步发生的事情是...
q=[*Z(R(0,B-1,2),R(B-1,0,-2))]
q
使用2个范围对象创建一个zip对象,其中一个对象由范围内0=>r+r+1
的每个第二整数组成,另一个由范围内的每个第二整数组成r+r+1=>0
。这是因为特定程度的克里特式迷宫的每个开始模式-
在每行中总是具有偶数个。例如,对于度的克里特式迷宫1
,r+r+1
等于3
,因此,其样式将始终以0
破折号开始,然后是另一行以4
(2 + 2)破折号开头。该zip对象将用于r+1
迷宫图案的第一行。
注:该唯一的理由q
是,将其从其余部分分离出来,因为q
被引用了几次,下标,并节省了大量的重复,并允许下标,我只是创建了一个拉链对象q
以列表的形式。
print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))
这是构建迷宫并组装在一起的最后一步。在此,将三个列表连接在一起,其中第一个由4*r+1
迷宫的顶行组成,第二个由迷宫的中间3*r+3
行组成,最后一个由迷宫的最后一行组成,最后一个列表由换行符(\n
)一长串。最后,打印出由整个迷宫组成的一条巨大的弦。让我们更深入地了解这两个列表和一个字符串实际包含的内容:
的第一列表,其中,另一个压缩对象在列表理解使用一个创建每个行一个,与领先|
或+
符号,一个奇数范围破折号0=>4*(r+1)
,拖尾|
或+
符号,然后换行(\n
)。如果是1
迷宫学位,此列表返回:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
第二个列表,由一个包含4个列表的zip对象组成,每个列表对应于前导/尾随|
符号的数量,+
符号的数量,破折号的数量,最后对应于最后一个列表,其中包含的第一r+1
行根据zip对象创建的图案,图案q
中间的行(没有的那一行|
)以及r+2
对称图案的最后几行。在这种情况下,此列表的zip对象中使用的最后一个列表将返回:
+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +
--+ | +-- <- Last line created especially for use in the middle of the labyrinth itself.
因此,在迷宫为1度的情况下,整个列表将返回:
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
这是最终列表,在其中创建了最后一行。在此,将P
创建列表数量的空格的最后一行的第一段(第一个空格之前的长度)。然后,添加同一行的最后一个段的长度(末段)+ 4个破折号,所有这些段的前面都带有一个+
符号。对于1级迷宫,此最后一个列表返回:
+---------------+
将所有这些结合在一起之后,此步骤最终返回完成的迷宫。如果是1度迷宫,它将最终返回以下内容:
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
+---------------+
R=range
一下吗?一样P='+'
吗?