Python 3.5、703 695 676 648 587 581 542 535 500 486 462 431 423 411バイト:
(55バイト(486-> 431)の保存に関するアドバイスをくれた@flawrに感謝します!)
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))]
zipオブジェクトはq
、2つの範囲オブジェクトで作成されます。1つは範囲内の2番目の整数で構成され、もう1つは範囲の2番目の整数で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]))
これが最後のステップであり、ラビリンスが構築されて組み立てられます。ここでは、1つ4*r+1
目はラビリンスの最上行で構成され、2つ目はラビリンスの中間3*r+3
行で構成され、最後のリストはラビリンスの最後の行で構成されている3つのリストが、改行(\n
)で結合されています1つの長い文字列。最後に、ラビリンス全体で構成されるこの1つの大きな文字列が印刷されます。これら2つのリストと1つの文字列が実際に含むものをさらに詳しく見てみましょう。
最初のリスト。リスト内包で別の圧縮オブジェクトを使用して、各行を先頭|
または+
記号、範囲内の奇数のダッシュ0=>4*(r+1)
、末尾|
または+
記号、および改行(\n
)で1つずつ作成します。次数1
迷路の場合、このリストは次を返します。
+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
2番目のリストは、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='+'
ですか?