Cây nghệ thuật ASCII


9

Một cây H là một cấu trúc cây fractal mà bắt đầu với một đường thẳng. Trong mỗi lần lặp, các nhánh T được thêm vào tất cả các điểm cuối. Trong thử thách này, bạn phải tạo một đại diện ASCII cho mỗi cấp độ cây H thứ hai .

Các cấp độ đầu tiên chỉ đơn giản chứa ba ký tự gạch nối-trừ:

---

Các cấp tiếp theo được xây dựng đệ quy:

  • Tạo ma trận 2x2 bản sao từ cấp trước, cách nhau bởi ba khoảng trắng hoặc dòng.
  • Kết nối trung tâm của các bản sao với các dòng nghệ thuật ASCII dưới dạng H. Sử dụng -cho các đường ngang, |cho các đường thẳng đứng và +bất cứ khi nào các đường gặp nhau.

Cấp độ thứ hai

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

Cấp độ thứ ba

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

Quy tắc

  • Đầu vào là một số nguyên biểu thị mức độ của cây H nghệ thuật ASCII như được mô tả ở trên ( không phải cấp độ cây H thực tế), bằng 0 hoặc một chỉ mục.
  • Đầu ra là linh hoạt. Ví dụ: bạn có thể in kết quả hoặc trả về một chuỗi phân tách dòng mới, danh sách các chuỗi cho mỗi dòng hoặc một mảng ký tự 2D.
  • Bạn phải sử dụng -, |, +và các nhân vật không gian.
  • Không gian lưu trữ và tối đa ba dòng khoảng trắng kéo dài được cho phép.

Đây là mã golf. Câu trả lời ngắn nhất trong byte thắng.


Câu trả lời:


7

Canvas , 20 19 byte

ø⁸«╵[↷L⇵;l⇵└┌├-×╋‼│

Hãy thử nó ở đây!

Giải trình:

ø                    push an empty canvas
 ⁸«╵[              repeat input*2 + 1 times
     ↷               rotate clockwise
      L⇵             ceil(width/2)
        ;l⇵          ceil(height/2); leaves stack as [ ⌈½w⌉, canvas, ⌈½h⌉ ]
           └┌        reorder stack to [ canvas, ⌈½w⌉, ⌈½h⌉, ⌈½w⌉ ]
             ├       add 2 to the top ⌈w÷2⌉
              -×     "-" * (2 + ⌈w÷2⌉)
                ╋    in the canvas, at (⌈w÷2⌉; ⌈h÷2⌉) insert the dashes
                 ‼   normalize the canvas (the 0th iteration inserts at (0; 0) breaking things)
                  │  and palindromize horizontally

7

Than , 22 byte

P-²FNF²«⟲T²+×⁺²κX²ι←‖O

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉ số 0. Giải trình:

P-²

In ba -s ban đầu , để con trỏ ở giữa.

FN

Lặp lại cho số lần được đưa ra.

F²«

Lặp lại hai lần cho mỗi lần H. Mỗi vòng lặp tạo ra một chút lớn hơn Htừ vòng lặp trước, nhưng chúng tôi chỉ muốn Hs thay thế .

⟲T²

Xoay hình.

+×⁺²κX²ι←

Vẽ một nửa dòng tiếp theo.

‖O

Phản ánh để hoàn thành bước.

Kết quả ở mỗi lần lặp như sau:

---

|   |
+---+
|   |

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

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

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

Nếu bạn tự hỏi mức độ thứ 5 Htrông như thế nào, một cái nhìn nhanh được phóng to nhanh: i.imgur.com/EGapcrS.png
Paul

1

Python 2 , 227 byte

L=len
def f(n):
 if n==1:return[['-']*3]
 m=[l+[' ']*3+l for l in f(n-1)];w=L(m[0]);y=L(m)/2;x=w/4-1;m=map(list,m+[' '*w,' '*x+'-'*(w-x-x)+' '*x,' '*w]+m)
 for i in range(y,L(m)-y):m[i][x]=m[i][w+~x]='|+'[m[i][x]>' ']
 return m

Hãy thử trực tuyến!


0

Perl 6 , 118 byte

{map ->\y{map {' |-+'.comb[:2[map {$^b%%1*$b&&6>=$^a/($b+&-$b)%8>=2},$^x/¾,y/2,y,$x/3-$_]]},2..^$_*6},2..^$_*4}o*R**2

Hãy thử trực tuyến!

Chỉ số 0. Trả về một mảng 2D của các ký tự. Ý tưởng cơ bản là biểu thức

b = y & -y   // Isolate lowest one bit
b <= x % (4*b) <= 3*b

tạo ra mô hình

--- --- --- ---
 -----   ----- 
--- --- --- ---
   ---------   
--- --- --- ---
 -----   ----- 
--- --- --- ---

Giải trình

{ ... }o*R**2  # Feed $_=2**$n into block
map ->\y{ ... },2..^$_*4  # Map y=2..2**n*4-1
map { ... },2..^$_*6      # Map $x=2..2**n*6-1
' |-+'.comb[:2[ ... ]]    # Choose char depending on base-2 number from two Bools
map { ... }  # Map coordinates to Bool
  # Horizontal lines
  ,$^x  # Modulo 8*¾=6
  ,y/2    # Skip every second row
  # Vertical lines
  ,y      # Modulo 8
  ,$x/3   # Skip every third column
   -$_    # Empty middle column
# Map using expression
$^b%%1*$b&&  # Return 0 if $b is zero or has fractional part
6>=$^a/($b+&-$b)%8>=2  # Pattern with modulo 8
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.