牛头怪的家装


42

牛头怪的家装

克里特岛迷宫很容易绘制。只需从对称形状开始(此处为红色)。让我们将这些行的所有端点称为“节点”。然后开始绘制拱形(黑色):第一个总是从顶部中间节点开始,并连接到右侧它旁边的节点,然后连接最接近前一个拱形的两个节点。重复此过程,直到所有节点都被覆盖。

gif

现在,我们可以概括这个概念:通过添加更多L形状,我们可以轻松生成新的初始图案。我列举了以下初始形状:

学位

最左侧的图案将产生克里特岛的迷宫度0。下一个将创建1级的克里特岛迷宫(原始的)。

任务

给定一个非负整数n,您的程序应输出克里特式迷宫度的ascii表示,n如以下示例所示。尾随空格/换行符无关紧要。您必须简短说明代码的工作方式。

例子

原始克里特岛拉比利斯(1度)的输出如下:

+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
              +---------------+

初始模式:

+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +

等级0的cretian迷宫应如下所示:

+-------------+ 
| +---------+ | 
| | +-----+ | | 
| | | +-+ | | | 
| | + | + | | | 
| +---+---+ | | 
+---+ | +---+ | 
      +-------+ 

初始模式:

+ | +
--+--
+ | +

Answers:


10

Perl 5,349字节

say$p="| "x$_,"+","-"x(16*$n-4*$_+13),"+ $p"for 0..4*($n=pop)+3;say$p="| "x(3*$n+2),"+ | ","| "x2x$n,"+ $p|";$p=~s/..//,$q="-"x(4*$_-1),say"$p+$q+ ","| "x(2*$n-2*$_+1),"+$q+ $p|"for 1..$n;$p=~s/..//;say$p,("+---"."-"x4x$n)x2,"+ $p|";$p=~s/..//,$q="-"x(4*$n+3)."-"x4x$_,say"$p+$q+ | ","| "x2x($n-abs$_),"+$q+ $p|"for-$n..$n;say" "x(8*$n+6),"+----$q+"

(将n作为命令行参数传递。)

在六个部分中逐行计算迷宫:

  • 前4n + 4行,
  • 下一行(唯一没有no的行-),
  • 接下来的n行,
  • 下一行(初始模式中间的行),
  • 接下来的2n +1行,
  • 最后一行(带有前导空格的行)。

6

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。话虽如此,基本上,逐步发生的事情是...

  1. q=[*Z(R(0,B-1,2),R(B-1,0,-2))]

    q使用2个范围对象创建一个zip对象,其中一个对象由范围内0=>r+r+1的每个第二整数组成,另一个由范围内的每个第二整数组成r+r+1=>0。这是因为特定程度的克里特式迷宫的每个开始模式-在每行中总是具有偶数个。例如,对于度的克里特式迷宫1r+r+1等于3,因此,其样式将始终以0破折号开始,然后是另一行以4(2 + 2)破折号开头。该zip对象将用于r+1迷宫图案的第一行。

    注:唯一的理由q是,将其从其余部分分离出来,因为q被引用了几次,下标,并节省了大量的重复,并允许下标,我只是创建了一个拉链对象q以列表的形式。

  2. 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度迷宫,它将最终返回以下内容:

    +-----------------------------+
    | +-------------------------+ |
    | | +---------------------+ | |
    | | | +-----------------+ | | |
    | | | | +-------------+ | | | |
    | | | | | +---------+ | | | | |
    | | | | | | +-----+ | | | | | |
    | | | | | | | +-+ | | | | | | |
    | | | | | + | | | + | | | | | |
    | | | | +---+ | +---+ | | | | |
    | | | +-------+-------+ | | | |
    | | +-------+ | +-------+ | | |
    | +-------+ | | | +-------+ | |
    +-----------+ | +-----------+ |
                  +---------------+
    

1
您可以先定义R=range一下吗?一样P='+'吗?
瑕疵的2016年

1
我认为您应该趁此机会说for g,o,k,u in Z
Sherlock9

@ Sherlock9哈哈!好主意!添加。:)
R. Kap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.