Nghệ thuật ASCII của ngày # 3 - Đền thờ Trung Quốc


16

Trong tập hôm nay của AAOD, chúng ta sẽ xây dựng một đền thờ Trung Quốc có độ cao khác nhau.

Hãy xem xét các ví dụ sau cho height ( N) 1đến6

N = 1:

       .
       |
  .   ]#[   .
   \_______/
.    ]###[    .
 \__]#.-.#[__/
  |___| |___|
  |___|_|___|
  ####/_\####
     |___|
    /_____\

N = 2:

         .
         |
    .   ]#[   .
     \_______/
  .    ]###[    .
   \___________/
.     ]#####[     .
 \___]#.---.#[___/
  |__|_|   |_|__|
  |__|_|___|_|__|
  #####/___\#####
      |_____|
     /_______\

N = 3:

           .
           |
      .   ]#[   .
       \_______/
    .    ]###[    .
     \___________/
  .     ]#####[     .
   \_______________/
.      ]#######[      .
 \____]#.-----.#[____/
  |__|__|     |__|__|
  |__|__|_____|__|__|
  ######/_____\######
       |_______|
      /_________\

N = 4:

             .
             |
        .   ]#[   .
         \_______/
      .    ]###[    .
       \___________/
    .     ]#####[     .
     \_______________/
  .      ]#######[      .
   \___________________/
.       ]#########[       .
 \_____]##.-----.##[_____/
  |__|__|_|     |_|__|__|
  |__|__|_|_____|_|__|__|
  ########/_____\########
         |_______|
        /_________\

N = 5:

               .
               |
          .   ]#[   .
           \_______/
        .    ]###[    .
         \___________/
      .     ]#####[     .
       \_______________/
    .      ]#######[      .
     \___________________/
  .       ]#########[       .
   \_______________________/ 
.        ]###########[        .
 \______]###.-----.###[______/
  |__|__|___|     |___|__|__|
  |__|__|___|_____|___|__|__|
  ##########/_____\##########
           |_______|
          /_________\

N = 6:

                 .
                 |
            .   ]#[   .
             \_______/
          .    ]###[    .
           \___________/
        .     ]#####[     .
         \_______________/
      .      ]#######[      .
       \___________________/
    .       ]#########[       .
     \_______________________/ 
  .        ]###########[        .
   \___________________________/ 
.         ]#############[         .
 \_______]####.-----.####[_______/
  |__|__|__|__|     |__|__|__|__|
  |__|__|__|__|_____|__|__|__|__|
  ############/_____\############
             |_______|
            /_________\

và như thế.

Các chi tiết xây dựng

Tôi chắc chắn rằng hầu hết các chi tiết về mô hình là rõ ràng. Dưới đây là một số chi tiết tốt hơn:

  • Cánh cửa ở dưới cùng của ngôi đền có thể tối thiểu là 1 _chiều rộng và tối đa là 5 _chiều rộng.
  • Sẽ luôn có hai .trực tiếp trên các trụ xung quanh cửa (hai dọc |).
  • Cầu thang bắt đầu với chiều rộng tương tự như cửa và tăng như hiển thị trong mẫu
  • Các ]##..##[khối trên mỗi cấp độ mái tăng kích thước 2từ trên xuống dưới.
  • Các \__...__/cấp mái tăng kích thước 4từ trên xuống dưới.
  • Các khối tường xung quanh cửa tối thiểu nên chứa 1 _và tối đa, 3 _giữa hai |. Ưu tiên đi vào các khối tường bên ngoài để cái gần cửa nhất có kích thước khác nhau cho mỗi cấp.
  • Không gian giữa .](hoặc [) được lấp đầy bởi #mái nhà ngay phía trên cửa ra vào.

Chi tiết thử thách

  • Viết hàm hoặc chương trình đầy đủ đọc số nguyên dương lớn hơn 0thông qua đối số hàm STDIN / ARGV / hoặc tương đương gần nhất và đầu ra (tới STDOUT hoặc tương đương gần nhất) NĐền thờ Trung Quốc
  • Trailing newline là tùy chọn.
  • Không nên có khoảng trắng ở cuối hoặc khoảng trống đủ để đệm đầu ra trong hình chữ nhật giới hạn tối thiểu.
  • Không nên có bất kỳ không gian hàng đầu nào không phải là một phần của mẫu.

Bảng xếp hạng

Bài đầu tiên của loạt bài tạo ra một bảng thành tích.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu mọi câu trả lời bằng tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Chiều rộng cửa có vẻ khá độc đoán với tôi - tại sao nó là 1 trong N=1trường hợp? Tại sao không phải là 3 và có cửa sổ bên nhỏ hơn như trong N=2trường hợp?
Matty

Ngoài ra, trong N=1trường hợp, không phải tầng thượng đầu tiên quá dài (rộng)?
Matty

@Matty liên quan đến cửa - nếu cửa có chiều rộng 3, thì sẽ không có #bên cạnh .để hỗ trợ ][bên trên nó. Về kích thước mái bắt đầu - Đó là kích thước mái ở mỗi mái trên cùng của chiều cao.
Tối ưu hóa

Tôi đã hỏi về phần dưới cùng của mái nhà ngay phía trên cửa sổ. Trong tất cả các trường hợp khác, nó là kích thước của mái nhà phía trên nó +4 (+2 ở hai bên). Nhưng đây là +8.
Matty

@Matty oh, bạn nói đúng. Đã sửa.
Trình tối ưu hóa

Câu trả lời:


2

CJam, 200 byte

-4'.-4'|]2/ri:M),{2af.-~[W'.I3+~']'#I)*][-2'\'_I2*4+*]]}fI~[~M)<']
M2m1e>'#*'.'-M3e<:D*][-3"|__"M*M2+M2*(e>:L<"_|"D~][_~~'_*][-3'#L)*
'/'_D*][L2+~'|'_D)*][L)~'/'_D2+*]]{{_0<{~S*}&}%s_W%1>"\/]""/\["erN}%

Dòng mới được thêm vào để tránh cuộn. Dùng thử trực tuyến

Giải thích ngắn gọn:

Chương trình xây dựng một nửa bên trái của ngôi đền (bao gồm cả giữa), sau đó đảo ngược nó và thay thế một số nhân vật để có được một nửa bên phải. Một loạt các không gian n được biểu diễn dưới dạng số ~ n (bitwise "không") trong quá trình xây dựng và được thay thế bằng các không gian thực tế ở cuối.

Chương trình bắt đầu với 2 dòng trên cùng, sau đó cho mỗi cấp độ mái, nó sẽ chuẩn bị tất cả các dòng trước đó với 2 khoảng trắng và thêm mái mới (2 dòng). Mái nhà cuối cùng được sửa đổi để thêm phần "cửa trên".

Tiếp theo, bức tường phía trên được xây dựng bằng cách lặp lại "| __" và cắt bớt ở độ dài phù hợp, theo sau là "_ |" cố định và không gian. Bức tường sau đó được nhân đôi và các không gian cửa được thay thế bằng dấu gạch dưới. Cuối cùng, phần dưới được xây dựng theo từng dòng.


5

Perl, 332 316 294

$:=($w=<>)*2+6;$r=2x($m=$w>3?3:$w);$k=1x($w-3).b.4x$m;
y!a-f1-4!/.|\\[,#_ -!,/,/,s/(.*),(.*).{@{-}}/$2$1/,printf"%$:s%s
",y!/\\[!\\/]!r,(reverse=~s/.//r)for@x=(b,c,
(map{b33.3x$_.e.1x$_,"[#$k,"x/$w/.a__.22x$_}1..++$w),
_c.3x$m.f.($z=substr"|__"x$:,0,2*++$w),"_|$r,$z","d$r,".11x$w,c_.$r,d__.$r)

Hãy thử tôi .

C, 371

d,i,w;char s[1<<24];m(){v(w,13);}p(){puts(s+1);}
v(i,j){s[w-i]=".|]\\#/"[j%7];s[w+i]=".|[/#\\"[j%7];
while(i--)s[w-i]=s[w+i]="# _-"[j/7];}
main(l){scanf("%d",&l);d=l>3?3:l;m(w=l*2+6);p(v(0,0));
for(v(0,1);i++<=l;v(i*2+2,17))p(),v(i*2+3,7),m(p(v(i,2)));v(l+2,2);p(v(d,21));
for(m(i=w-3);i>d+1;i-=3)v(i,15);p(v(d,8));p(v(d,15));
v(w-3,4);m(p(v(d,19)));p(v(d+1,15));p(v(d+2,19));}

Hãy thử tôi .

JavaScript, 365

Ở trên có thể được dịch gần như 1 thành 1 thành JavaScript:

s=[];r="";i=0;m=()=>v(w,13);p=()=>r+=s.join('')+"\n";
v=(i,j)=>{s[w-i]=".|]\\#/"[j%7];s[w+i]=".|[/#\\"[j%7];
while(i--)s[w-i]=s[w+i]="# _-"[j/7|0];};
f=l=>{d=l>3?3:l;m(w=l*2+6);p(v(0,0));
for(v(0,1);i++<=l;v(i*2+2,17))p(),v(i*2+3,7),m(p(v(i,2)));v(l+2,2);p(v(d,21));
for(m(i=w-3);i>d+1;i-=3)v(i,15);p(v(d,8));p(v(d,15));
v(w-3,4);m(p(v(d,19)));p(v(d+1,15));p(v(d+2,19));}

Sử dụng:

f(2);console.log(r)

Phiên bản C gặp sự cố với kích thước trên 12. Vì có vẻ như bạn đang sử dụng chuỗi kích thước cố định để giữ kết quả tạm thời, tôi nghĩ bạn sẽ luôn có giới hạn trên, bất kể bạn chọn kích thước như thế nào s. Trừ khi bạn phân bổ nó một cách linh hoạt, tất nhiên.
Reto Koradi

@RetoKoradi, Có bạn nói đúng, tôi đã đăng phiên bản với một bộ đệm nhỏ do nhầm lẫn. Nhưng cuối cùng, trừ khi nó được phân bổ động, sẽ luôn có một giới hạn.
nutki

4

Python 2, 356 352 347 344 byte

n=input()
A,B,C,D,E,F,G,H,I='_ |\/#.]['
def p(*S):
 for s in S:print(5+2*n-len(s)/2)*B+s
p(G,C,'.   ]#[   .')
for i in range(n):b=B*(4+i);p(D+A*(7+4*i)+E,G+b+H+F*(3+2*i)+I+b+G)
d=2*min(3,n)-1
a=A*(2+i)
f=F*(1+i-d/2)
j=4+2*i-d/2
w=('|__'*n)[:j-1]+A+C
v=w[::-1]
p(D+a+H+f+G+'-'*d+G+f+I+a+E,w+B*d+v,w+A*d+v,F*j+E+A*d+D+F*j,C+A*(d+2)+C,E+A*(d+4)+D)

Điều này về cơ bản xây dựng các dòng điện thờ theo dòng. Hàm pin một chuỗi với các khoảng trắng cần thiết để căn giữa nó.

Tôi đã sử dụng python 2 để lưu rất nhiều byte, vì đối tượng bản đồ python 3 không kích hoạt. Tôi đoán tôi nên luôn chơi golf trong python 2 , chỉ cần lưu thêm một vài byte (ngay cả khi nó không phải phân tích cú pháp đầu vào thành int). Hehehe, nó không giống như mã đẹp cho việc chơi golf ở nơi đầu tiên.

Chỉnh sửa: và tất nhiên, giờ tôi không cần bản đồ nữa ...

Đây là mã ở dạng không được phép:

n = int(input())

# A function to print strings centered
half_width = 5 + 2*n
def p(string):
    spaces = ' ' * (half_width - len(string) // 2)
    print(spaces + string)

# The rooftops
p('.')
p('|')
p('.   ]#[   .')
for i in range(n):
    p('\\' + '_'*(7 + 4*i) + '/')
    p('.{0}]{1}[{0}.'.format(' '*(i + 4), '#'*(3 + 2*i)))

# The bottom rooftop
door_width = 2 * min(3, n) - 1
# (11+4i - (3+2i) - 4) / 2 = (4 + 2i) / 2 = 2 + i
p('\{0}]{1}.{2}.{1}[{0}/'.format('_'*(2 + i), '#'*(1 + i - door_width // 2), '-'*door_width))

# The windows
w = '|__'*n
w = w[:4 + 2*i  - door_width // 2]
if w[-1] == '|':
    w = w[:-1] + '_'
w += '|'
p(w + ' '*door_width + w[::-1])
p(w + '_'*door_width + w[::-1])

# The foundation and the stairs
w = '#'*(4 + 2*i - door_width // 2)
p(w + '/' + '_'*(door_width) + '\\' + w)

# The remaining stairs
p('|' + '_'*(door_width + 2) + '|')
p('/' + '_'*(door_width + 4) + '\\')

1
Vì bạn đang sử dụng Python 2, bạn có thể thay đổi print(B*(5+2*n-len(s)//2)+s)thành print B*(5+2*n-len(s)/2)+s(xóa dấu ngoặc đơn và thay đổi //thành /).
dùng12205

1
Cảm ơn @ace, không biết python2 đã bỏ qua phân chia float.
Matty

1
@Matty Nó không bỏ qua phân chia float. Bạn đang thực hiện phép chia trên số nguyên , do đó, kết quả là một số nguyên. Nó chỉ thực hiện phép chia float nếu một hoặc nhiều toán hạng là float.
mbomb007

2
Nếu bạn sắp xếp lại thứ tự print B*(5+2*n-len(s)/2)+sđến print(5+2*n-len(s)/2)*B+s, bạn có thể xóa khoảng trống sau print.
isaacg

4

JavaScript ( ES6 ), 440

Chỉnh sửa lỗi lintel

Một hàm có chiều cao như một tham số, xuất ra bàn điều khiển.

Sử dụng chuỗi mẫu rất nhiều , tất cả các dòng mới đều có ý nghĩa và được tính.

Chạy đoạn trích để kiểm tra trong Firefox (với đầu ra giao diện điều khiển)

f=x=>{R=(n,s=0)=>' #_-'[s][Z='repeat'](n),M=c=>R(2)+'|__'[Z](z+1).slice(0,z-1)+'_|'+R(y,c)+'|_'+'__|'[Z](z+1).slice(1-z)
for(z=x+x+(x<2)+(x<3),y=x>2?5:x>1?3:1,l=-1,o=`${t=R(x+x+5)}.
${t}|
`;l++<x;)o+=`${t=R(x+x-l-l)}.${u=R(l+3)}]${R(l*2+1,1)}[${u}.
 ${t}\\${l-x?R(7+l*4,2):`${t=R(x+1,2)}]${u=R(x<3||x-2,1)}.${R(y,3)}.${u}[${t}`}/
`;console.log(`${o+M(0)}
${M(2)}
${R(2)}${t=R(z,1)}/${u=R(y,2)}\\${t}
${R(1+z)}|__${u}|
${R(z)}/____${u}\\`)}

// TEST
f(1),f(2),f(3),f(4),f(5),f(6)
Output 1 to 6 in console

Phiên bản Ungolfed để thử nghiệm tương tác:

// Not so golfed

f=x=>{
  R=(n,s=0)=>' #_-'[s].repeat(n); // base building blocks
  M=c=>R(2)+'|__'.repeat(z+1).slice(0,z-1)+'_|'+R(y,c)+'|_'+'__|'.repeat(z+1).slice(1-z); // manage door level

  z=x+x+(x<2)+(x<3); // door and stairs surroundings
  y=x>2?5:x>1?3:1; // door and stairs width
  
  o = `${R(x+x+5)}.\n${R(x+x+5)}|\n`; // top 
  for(l=-1;l++<x;)
    o += `${ // even row
      t=R(x+x-l-l) // left padding
    }.${
      u=R(l+3)
    }]${
      R(l*2+1,1)
    }[${
      u
    }.\n ${ // end even row, start odd row
      t // left padding
    }\\${
      l-x?R(7+l*4,2)
      :`${t=R(x+1,2)}]${u=R(x<3||x-2,1)}.${R(y,3)}.${u}[${t}` // if last row before the door, insert lintel 
    }/\n`;
  
  o += `${
    M(0) // door level row 1
  }\n${
    M(2) // door level row 2
  }\n${
    R(2)}${t=R(z,1)}/${u=R(y,2)}\\${t  // stairs row 1
  }\n${ 
    R(1+z)}|__${u  // stairs row 2
  }|\n${ 
    R(z)}/____${u // stairs row 3
  }\\`;
  
  out(o)
}

out=x=>O.innerHTML=x

f(3)
<input id=I value=3><button onclick='f(+I.value)'>-></button><br>
<pre id=O></pre>


2

Haskell, 473 byte

g '\\'='/'
g '/'='\\'
g '['=']'
g ']'='['
g x=x
z=reverse
d=min 3
m n s=putStrLn$(6+2*n+1-length s)#' '++map g(z s)++tail s
n#c=replicate n c
t 0=".";t n=n#'#'++"["++(2+n)#' '++"."
r 0="|";r n=(2+2*n)#'_'++"/"
q n=d n#'-'++"."++max(n-2)1#'#'++"["++(n+1)#'_'++"/"
e i n=d n#i++"|_"++z(take(max(n+2)(2*n-1))(cycle"|__"))
b n=d n#'_'++"\\"++max(2*n)(3+n)#'#'
w i n=(d n+1+i)#'_'++["|","\\"]!!i
f n=mapM_(m n)$[u k|k<-[0..n],u<-[t,r]]++(t(n+1):map($n)[q,e ' ',e '_',b,w 0,w 1])

Được rồi cảm ơn. Có vẻ đúng ngay bây giờ
Damien

Tôi nghĩ bây giờ nó ổn rồi. btw, cơ sở trong đền thờ N = 1 của bạn có thêm một #
Damien

Yup, làm việc bây giờ. Đã sửa lỗi thêm ngoài ý muốn#
Trình tối ưu hóa

0

C, 660 byte

Mẫu hình dường như quá bất thường để đưa ra bất cứ thứ gì lạ mắt, đặc biệt là trong một ngôn ngữ không có xử lý chuỗi. Vì vậy, đây là cách tiếp cận vũ phu của tôi:

m,d,w,k,j;r(n,c){for(j=0;j++<n;)putchar(c);}c(char*s){for(;*s;)putchar(*s++);}f(n){m=n*2;d=n<3?m-1:5;w=m-d/2+2;r(m+5,32);c(".\n");r(m+5,32);c("|\n");for(;;){r(m-k*2,32);c(".");r(k+3,32);c("]");r(k*2+1,35);c("[");r(k+3,32);c(".\n");if(k==n)break;r(m-k*2+1,32);c("\\");r(k++*4+7,95);c("/\n");}c(" \\");r(n+1,95);c("]");r(n-d/2,35);c(".");r(d,45);c(".");r(n-d/2,35);c("[");r(n+1,95);c("/\n");for(k=0;k<2;){c("  ");for(j=0;j<w/3;++j)c("|__");c("|_|"-w%3+2);r(d,k++?95:32);c(!w%3?"|":w%3<2?"|_":"|_|");for(j=0;j<w/3;++j)c("__|");c("\n");}c("  ");r(w,35);c("/");r(d,95);c("\\");r(w,35);c("\n");r(w+1,32);c("|");r(d+2,95);c("|\n");r(w,32);c("/");r(d+4,95);c("\\\n");}

Trước khi chơi golf:

#include <stdio.h>

void r(int n, int c) {
    for (int i = 0; i++ < n; )
        putchar(c);
}

void c(char* s) {
    for (; *s; ++s) putchar(*s);
}

int f(int n) {
    int m = n * 2;
    int d = n < 3 ? m - 1 : 5;
    int w = m - d / 2 + 2;

    r(m + 5, 32);
    c(".\n");

    r(m + 5, 32);
    c("|\n");

    for (int k = 0; ; ++k) {
        r(m - k * 2, 32);
        c(".");
        r(k + 3, 32);
        c("]");
        r(k * 2 + 1, 35);
        c("[");
        r(k + 3, 32);
        c(".\n");

        if (k == n) break;

        r(m - k * 2 + 1, 32);
        c("\\");
        r(k * 4 + 7, 95);
        c("/\n");
    }

    c(" \\");
    r(n + 1, 95);
    c("]");
    r(n - d / 2 , 35);
    c(".");
    r(d, 45);
    c(".");
    r(n - d / 2 , 35);
    c("[");
    r(n + 1, 95);
    c("/\n");

    for (int k = 0; k < 2; ++k) {
        c("  ");
        for (int j = 0; j < w / 3; ++j)
            c("|__");
        c("|_|" - w % 3 + 2);
        r(d, k ? 95 : 32);
        c(!w % 3 ? "|" : w % 3 < 2 ? "|_" : "|_|");
        for (int j = 0; j < w / 3; ++j)
            c("__|");
        c("\n");
    }

    c("  ");
    r(w, 35);
    c("/");
    r(d, 95);
    c("\\");
    r(w, 35);
    c("\n");

    r(w + 1, 32);
    c("|");
    r(d + 2, 95);
    c("|\n");

    r(w, 32);
    c("/");
    r(d + 4, 95);
    c("\\\n");

    return 0;
}

Không có nhiều để giải thích ở đây. Nó chỉ đi theo từng dòng và tạo ra số lượng cần thiết của mỗi nhân vật. Tôi đã cố gắng để giữ cho bản thân mã nhỏ gọn, nhưng nó vẫn còn tăng lên. dlà chiều rộng của cửa, wchiều rộng của mỗi bức tường gạch.


1
c(char*s){for(;*s;)putchar(*s++);}==> #define c printf; r(n,c){for(j=0;j++<n;)putchar(c);}==>r(n,C){while(n--)putchar(C);}
user12205
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.