Cải thiện nhà cho Minotaur


42

Cải thiện nhà cho Minotaur

Mê cung cretan khá dễ vẽ. Chỉ cần bắt đầu với một hình dạng đối xứng (ở đây màu đỏ). Chúng ta hãy gọi tất cả các điểm cuối của các nút đó là 'nút'. Sau đó, bạn bắt đầu vẽ các vòm (màu đen): Cái đầu tiên bắt đầu ở nút giữa trên cùng và kết nối với nút bên cạnh nó ở phía bên phải, sau đó hai nút gần nhất với vòm trước được kết nối. Điều này được lặp đi lặp lại cho đến khi tất cả các nút được bảo hiểm.

ảnh động

Bây giờ chúng ta có thể khái quát khái niệm này: Chúng ta có thể dễ dàng tạo các mẫu ban đầu mới bằng cách thêm nhiều Lhình dạng hơn . Tôi liệt kê các hình dạng ban đầu như sau:

trình độ

Mẫu bên trái nhất sẽ tạo ra một mê cung cretan độ 0 . Cái tiếp theo sẽ tạo ra một mê cung cretan cấp 1 (bản gốc), v.v.

Bài tập, nhiệm vụ

Với một số nguyên không âm n, chương trình của bạn sẽ xuất ra biểu diễn ascii của một mê cung độ cretan n, được hiển thị trong các ví dụ sau. Không gian lưu trữ / dòng mới không quan trọng. Bạn phải bao gồm một lời giải thích ngắn về cách mã của bạn hoạt động.

Ví dụ

Đầu ra cho mê cung cretan ban đầu (độ 1) như sau:

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

Mẫu ban đầu:

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

Mê cung của ngôi sao cấp 0 nên trông như vậy:

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

Mẫu ban đầu:

+ | +
--+--
+ | +

Câu trả lời:


10

Perl 5, 349 byte

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+"

( Truyền n dưới dạng đối số dòng lệnh.)

Tính toán từng dòng mê cung trong sáu phần:

  • 4n + 4 dòng đầu tiên,
  • dòng tiếp theo (dòng duy nhất không có -),
  • n dòng tiếp theo,
  • dòng tiếp theo (dòng ở giữa mẫu ban đầu),
  • 2n + 1 dòng tiếp theo,
  • dòng cuối cùng (dòng với không gian hàng đầu).

6

Python 3.5, 703 695 676 648 587 581 542 535 500 486 462 431 423 411 byte:

( Cảm ơn @flawr đã tư vấn về cách lưu 55 byte (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]))

Không có nhiều ứng cử viên cho danh hiệu, nhưng tôi vẫn cho nó một shot, và nó hoạt động hoàn hảo. Tôi sẽ cố gắng rút ngắn nó nhiều hơn theo thời gian mà tôi có thể, nhưng bây giờ, tôi yêu nó và không thể hạnh phúc hơn.

Hãy thử trực tuyến! (Ideone) (Có thể trông hơi khác một chút ở đây vì những hạn chế của trình biên dịch trực tuyến rõ ràng. Tuy nhiên, nó vẫn rất giống nhau.)

Giải trình:

Đối với mục đích của giải thích này, hãy giả sử rằng hàm trên được thực thi với đầu vào, rbằng 1. Điều đó đang được nói, về cơ bản những gì đang xảy ra, từng bước một, là ...

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

    Một đối tượng zip q, được tạo với 2 đối tượng phạm vi, một đối tượng bao gồm mọi số nguyên thứ hai trong phạm vi 0=>r+r+1và một đối tượng khác bao gồm mọi số nguyên thứ hai trong phạm vi r+r+1=>0. Điều này là do mỗi mô hình bắt đầu của một mê cung cretan ở một mức độ cụ thể sẽ luôn luôn có một số chẵn -trong mỗi dòng. Ví dụ, đối với một mê cung độ 1, r+r+1bằng 3, và do đó, mẫu của nó sẽ luôn bắt đầu bằng 0dấu gạch ngang, tiếp theo là một dòng khác với dấu gạch ngang 4(2 + 2). Đối tượng zip này sẽ được sử dụng cho các r+1dòng đầu tiên của mẫu mê cung.

    Lưu ý: Các chỉ lý do qlà danh sách và tách ra khỏi phần còn lại là vì qđược tham chiếu một vài lần và subscripted, và để tiết kiệm rất nhiều sự lặp lại và cho phép subscripting, tôi chỉ đơn giản là tạo ra một đối tượng zip qdưới dạng một danh sách.

  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]))

    Đây là bước cuối cùng, trong đó mê cung được xây dựng và đặt lại với nhau. Ở đây, ba danh sách, danh sách đầu tiên bao gồm các 4*r+1dòng trên cùng của mê cung, danh sách thứ hai bao gồm các 3*r+3dòng giữa của mê cung và danh sách cuối cùng bao gồm dòng cuối cùng của mê cung được nối với nhau, với các dòng ngắt ( \n) thành một chuỗi dài. Cuối cùng, một chuỗi lớn bao gồm toàn bộ mê cung được in ra. Chúng ta hãy đi sâu hơn vào những gì 2 danh sách này và 1 chuỗi thực sự chứa:

    • Danh sách thứ nhất, trong đó một đối tượng được nén khác được sử dụng để hiểu danh sách để tạo từng dòng một, với đầu |hoặc +ký hiệu, một số dấu gạch ngang lẻ trong phạm vi 0=>4*(r+1), dấu |hoặc +ký hiệu và sau đó là một dòng mới ( \n). Trong trường hợp 1mê cung độ , danh sách này trả về:

      +-----------------------------+
      | +-------------------------+ |
      | | +---------------------+ | |
      | | | +-----------------+ | | |
      | | | | +-------------+ | | | |
      | | | | | +---------+ | | | | |
      | | | | | | +-----+ | | | | | |
      | | | | | | | +-+ | | | | | | |
      
    • Danh sách thứ 2, bao gồm một đối tượng zip chứa 4 danh sách và mỗi danh sách tương ứng với số |ký hiệu hàng đầu / dấu , số +ký hiệu, số dấu gạch ngang và cuối cùng là danh sách cuối cùng chứa các r+1dòng đầu tiên mẫu được tạo theo đối tượng zip q, dòng ở giữa mẫu (mẫu không có |) và r+2dòng cuối cùng của mẫu đối xứng. Trong trường hợp cụ thể này, danh sách cuối cùng được sử dụng trong đối tượng zip của danh sách này sẽ trả về:

      + | | | +
      --+ | +--
      ----+----
      --+ | +-- 
      + | | | + 
      --+ | +--  <- Last line created especially for use in the middle of the labyrinth itself.
      

      Và do đó, trong trường hợp mê cung 1 độ, toàn bộ danh sách này sẽ trở lại:

      | | | | | + | | | + | | | | | |
      | | | | +---+ | +---+ | | | | |
      | | | +-------+-------+ | | | |
      | | +-------+ | +-------+ | | |
      | +-------+ | | | +-------+ | |
      +-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
      
    • Danh sách cuối cùng này, trong đó dòng cuối cùng được tạo ra. Ở đây, đoạn đầu tiên (đoạn trước Pkhoảng trắng đầu tiên) của dòng danh sách cuối cùng của số khoảng trắng được tạo. Sau đó, độ dài của đoạn cuối cùng (đoạn kết thúc) của cùng một dòng + 4 số dấu gạch ngang được thêm vào, tất cả đều được đặt trước và theo sau là một +ký hiệu duy nhất . Trong trường hợp mê cung cấp 1, danh sách cuối cùng này trả về:

                    +---------------+
      

    Sau khi kết hợp tất cả lại với nhau, bước này cuối cùng cũng trả lại mê cung đã hoàn thành. Trong trường hợp mê cung 1 độ, cuối cùng nó sẽ trả về điều này:

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

1
Bạn có thể đầu tiên có thể định nghĩa R=rangehoặc một cái gì đó như thế? Giống nhau cho P='+'?
flawr

1
Tôi nghĩ bạn nên tận dụng cơ hội vàng để nóifor g,o,k,u in Z
Sherlock9

@ Sherlock9 Haha! Ý tưởng tốt! Thêm. :)
R. Kap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.