ミノタウロスのホームセンター


42

ミノタウロスのホームセンター

クレタンの迷宮は描くのがとても簡単です。対称形状(ここでは赤)から始めます。これらの行のすべてのエンドポイントを「ノード」と呼びましょう。次に、アーチの描画を開始します(黒):最初のアーチは常に上部中央ノードから始まり、右側の隣のノードに接続します。次に、前のアーチに最も近い2つのノードが接続されます。これは、すべてのノードがカバーされるまで繰り返されます。

gif

これで、この概念を一般化できますL。形状を追加することで、新しい初期パターンを簡単に生成できます。次のように初期形状を列挙しました。

程度

最も左のパターンは、0度のクレタン迷路を生成します。次のものは、次数1のクレタン迷路(元の迷路)などを作成します。

仕事

非負の整数を指定するnと、プログラムはn次の例に示すように、次のクレタン迷路のASCII表現を出力する必要があります。末尾のスペース/改行は関係ありません。コードがどのように機能するかについての簡単な説明を含める必要があります。

元のクレタンラビリス(次数1)の出力は次のとおりです。

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

初期パターン:

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

次数0のクレタ島の迷宮は次のようになります。

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

初期パターン:

+ | +
--+--
+ | +

回答:


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を渡します。)

6つのセクションで迷路を1行ずつ計算します。

  • 最初の4n + 4行、
  • 次の行(のない唯一の行-)、
  • 次のn行、
  • 次の行(初期パターンの中央の行)、
  • 次の2n + 1行、
  • 最終行(先頭にスペースがある行)。

6

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。つまり、基本的にステップバイステップで何が起こっているのかは...

  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。これは、特定の度合いのクレタン迷路のすべての開始パターンが、-各行で常に偶数になるためです。例えば、度のクレタ迷路ため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]))

    これが最後のステップであり、ラビリンスが構築されて組み立てられます。ここでは、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度のラビリンスの場合、最終的にこれを返します。

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

1
おそらく最初に定義することはできますR=rangeか?同じP='+'ですか?
-flawr

1
私はあなたが言うには絶好の機会を取るべきだと思うfor g,o,k,u in Z
Sherlock9

@ Sherlock9ハハ!良いアイデア!追加されました。:)
R. Kap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.