Không thể thấy rừng để lấy chìa khóa


16

Viết chương trình hoặc hàm có trong danh sách số nguyên không trống trong bất kỳ định dạng thuận tiện hợp lý nào, chẳng hạn như 4, 0, -1, -6, 2hoặc [4 0 -1 -6 2].

In hoặc trả về một chuỗi mô tả danh sách như một khu rừng nghệ thuật ASCII nơi mỗi số trở thành một cây có chiều cao tỷ lệ thuận. Mỗi cây chiếm bốn cột văn bản trong đầu ra như sau:

  • Một số nguyên dương N trở thành một cây có gốc __|_và đỉnh là ^ , với N lớp / \ở giữa.

    Ví dụ: khi N = 1 cây

      ^
     / \
    __|_
    

    khi N = 2 cây

      ^
     / \
     / \
    __|_
    

    khi N = 3 cây là

      ^
     / \
     / \
     / \
    __|_
    

    và như thế.

  • Một số nguyên âm N trở nên giống như cây dương tương ứng ngoại trừ một thanh dọc nằm giữa các dấu gạch chéo thay vì khoảng trắng.

    Ví dụ: khi N = -1 cây

      ^
     /|\
    __|_
    

    khi N = -2 cây là

      ^
     /|\
     /|\
    __|_
    

    khi N = -3 cây

      ^
     /|\
     /|\
     /|\
    __|_
    

    và như thế.

  • Khi số nguyên bằng 0, về mặt kỹ thuật không có cây, chỉ có một khoảng trống gồm bốn dấu gạch dưới:

    ____
    

Các dấu gạch dưới ở gốc của mỗi cây phải xếp hàng ở đầu ra, tức là tất cả các cây phải có các cơ sở của chúng ở cùng cấp. Ngoài ra, một dấu gạch dưới duy nhất được thêm vào cuối dòng gạch dưới sau cây cuối cùng. Điều này làm cho nó để mỗi cây có một cột "không khí" trống ở hai bên của nó.

Ví dụ, đầu ra cho 4 0 -1 -6 2sẽ là

              ^
             /|\
  ^          /|\
 / \         /|\
 / \         /|\  ^
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__

Lưu ý làm thế nào các mẫu cây luôn có một cột hàng đầu của không gian trống nhưng một dấu gạch dưới phải được thêm vào để đệm phía bên phải của cây cuối cùng.

Cũng thế:

  • Không gian lưu trữ trên bất kỳ dòng nào là tốt, nhưng không nên có không gian hàng đầu không cần thiết.
  • Các dòng mới hàng đầu không được phép (cây cao nhất sẽ chạm vào đỉnh của lưới văn bản đầu ra) và chỉ cho phép tối đa một dòng mới.
  • Danh sách có thể chứa bất kỳ số nguyên nào từ -250 đến 250. Xử lý cây cao hơn là không cần thiết.

Mã ngắn nhất tính bằng byte thắng.

Thêm ví dụ

3:

  ^
 / \
 / \
 / \
__|__

-2:

  ^
 /|\
 /|\
__|__

0:

_____

0, 0:

_________

0, 1, 0:

      ^
     / \
______|______

0, -1, 2, -3, 4:

                  ^
              ^  / \
          ^  /|\ / \
      ^  / \ /|\ / \
     /|\ / \ /|\ / \
______|___|___|___|__

Câu trả lời:


6

Bình thường, 48 byte

j_.t+sm.i,J\_?d++\|sm?>d0\ \|d\^Jms+Jmkd"/\\"QJd

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Quá lười cho một lời giải thích đầy đủ. Ở đây chỉ là tổng quan ngắn:

Tôi tạo các cột đầu tiên. Vì vậy, hình ảnh:

      ^ 
  ^  /|\
 / \ /|\
__|___|__

được tạo như:

["_", "_/", "| ^", "_\", "_", "_//", "|||^", "_\\", "_"]

Lưu ý rằng tôi chỉ tạo phần dưới (mọi thứ không có khoảng trắng). Và tôi cũng đang tạo ra chúng từ dưới lên trên. Điều này được thực hiện khá đơn giản.

Sau đó, tôi có thể sử dụng .tphương thức để nối các khoảng trắng vào các chuỗi, sao cho mỗi chuỗi có độ dài bằng nhau. Và sau đó tôi đảo ngược thứ tự và in.


Lưu ý: Nếu đây là một đầu ra thực tế, bạn có thể đã quên thêm một dấu _(gạch dưới) sau cây cuối cùng.
insertusernamehere 7/12/2015

1
@insertusernamehere Cảm ơn, hoàn toàn bỏ qua dấu vết _.
Jakube 7/12/2015

7

Python 2, 165 byte

a=input()
l=max(map(abs,a))
while l+2:s=' _'[l<0];print(s+s.join((([' ^ ','//| \\\\'[x>0::2],'   '][cmp(abs(x),l)],'_|_')[l<0],s*3)[x==0]for x in a)+s).rstrip();l-=1

Đây là một chương trình đầy đủ chấp nhận một danh sách làm đầu vào. Tôi vẫn đang chơi golf hỗn độn khủng khiếp này.


4

PHP, 231 277 byte

Thử thách này có một đầu ra đẹp.

$x=fgetcsv(STDIN);for(;$i<2+max(array_map(abs,$x));$i++)for($j=0;$j<count($x);){$_=$x[$j++];$o[$i].=!$i?$_?'__|_':____:(abs($_)>=$i?0>$_?' /|\\':' / \\':($i-1&&abs($_)==$i-1?'  ^ ':'    '));}echo implode("
",array_reverse($o))."_";

Đọc danh sách được phân tách bằng dấu phẩy (khoảng trắng là tùy chọn) từ STDIN:

$ php trees.php
> 1, 2, 0, -4, 6

Bị đánh cắp

$x=fgetcsv(STDIN);
for(;$i<2+max(array_map(abs,$x));$i++)
    for($j=0;$j<count($x);){
        $_=$x[$j++];
        $o[$i] .= !$i ? $_?'__|_':____
                      : (abs($_)>=$i ? 0>$_?' /|\\':' / \\'
                                     : ($i-1&&abs($_)==$i-1 ? '  ^ ' : '    '));
    }
echo implode("\n",array_reverse($o))."_";

Chỉnh sửa

  • Đã lưu 46 byte . Loại bỏ khởi tạo mảng, được thay thế if/elsebằng các toán tử ternary và di chuyển một số biến xung quanh để lưu một vài byte.

2

Ruby, 157 156 153 ký tự

->h{r=[]
h.map{|i|j=i.abs
r+=[s=?_,?/*j+s,i==0?s:?^+(i>0?' ':?|)*j+?|,?\\*j+s].map{|l|l.rjust(h.map(&:abs).max+2).chars}}
r.transpose.map{|l|l*''}*$/+?_}

Viết chỉ vì ban đầu Array.transposetrông giống như một ý tưởng tốt. Không còn nữa.

Chạy mẫu:

2.1.5 :001 > puts ->h{r=[];h.map{|i|j=i.abs;r+=[s=?_,?/*j+s,i==0?s:?^+(i>0?' ':?|)*j+?|,?\\*j+s].map{|l|l.rjust(h.map(&:abs).max+2).chars}};r.transpose.map{|l|l*''}*$/+?_}[[4, 0, -1, -6, 2]]
              ^     
             /|\    
  ^          /|\    
 / \         /|\    
 / \         /|\  ^ 
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__

Việc thu thập các mảnh thành một mảng riêng thay vì trả chúng từ bản đồ đầu tiên sẽ cho phép tránh sử dụng giảm.
manatwork 8/12/2015

0

C #, 318 byte

Tôi đã thử chuyển mảng. Tôi không chắc đó có phải là giải pháp tốt nhất không.

string F(int[]a){int i=a.Length,j,w=i*4+1,h=0;string f="",o=f;for(;i-->0;){j=a[i];f+=","+" _,".PadLeft(j=j>0?j+3:-j+3,'\\')+(j>3?"^"+"|_,".PadLeft(j,a[i]<0?'|':' '):"_,")+" _,_".PadLeft(j+1,'/');h=h<j?j:h;}f="_".PadLeft(h=h>3?h:2,'\n')+f;for(i+=h<3?1:0;++i<h;)for(j=w;j-->0;)o+=f.Split(',')[j].PadLeft(h)[i];return o;}

Ấn định và dòng mới cho rõ ràng:

string F(int[]a)
{
    int i=a.Length,
        j,
        w=i*4+1,
        h=0;
    string f="",o=f;
    for(;i-->0;){
        j=a[i];
        f+=","+" _,".PadLeft(j=j>0?j+3:-j+3,'\\')+(j>3?"^"+"|_,".PadLeft(j,a[i]<0?'|':' '):"_,")+" _,_".PadLeft(j+1,'/');
        h=h<j?j:h;
    }
    f="_".PadLeft(h=h>3?h:2,'\n')+f;
    for(i+=h<3?1:0;++i<h;)
        for(j=w;j-->0;)
            o+=f.Split(',')[j].PadLeft(h)[i];
    return o;
}
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.