Seni ASCII Hari # 3 - Kuil Cina

16

Dalam episode AAOD hari ini, kita akan membangun Kuil Cina dengan ketinggian yang bervariasi.

Pertimbangkan contoh berikut untuk tinggi ( N) 1hingga6

N = 1:

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

N = 2:

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

N = 3:

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

N = 4:

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

N = 5:

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

N = 6:

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

dan seterusnya.

Detail Konstruksi

Saya yakin sebagian besar detail tentang polanya jelas. Berikut adalah beberapa detail yang lebih baik:

  • Pintu di bagian bawah kuil setidaknya dapat memiliki 1 _lebar dan maksimum menjadi 5 _lebar.
  • Akan selalu ada dua .tepat di atas pilar di sekitar pintu (dua vertikal |).
  • Tangga dimulai dengan lebar yang sama dengan pintu dan meningkat seperti yang ditunjukkan dalam pola
  • The ]##..##[blok di atas masing-masing tingkat atap peningkatan ukuran 2dari atas ke bawah.
  • Tingkat \__...__/atap meningkat dalam ukuran 4dari atas ke bawah.
  • Blok dinding di sekitar pintu minimal harus berisi 1 _dan maksimum, di 3 _antara keduanya |. Prioritas masuk ke blok dinding luar sehingga yang paling dekat dengan pintu mendapatkan ukuran yang bervariasi untuk setiap tingkat.
  • Ruang antara .dan ](atau [) diisi oleh #di atap tepat di atas pintu.

Detail Tantangan

  • Tulis fungsi atau program lengkap yang membaca bilangan bulat positif lebih besar daripada 0melalui argumen STDIN / ARGV / fungsi atau setara terdekat dan keluaran (ke STDOUT atau setara terdekat) the NChinese Shrine
  • Mengejar baris baru adalah opsional.
  • Seharusnya tidak ada ruang trailing atau ruang trailing yang cukup untuk mengisi output dalam persegi panjang batas minimum.
  • Seharusnya tidak ada ruang utama yang bukan bagian dari pola.

Papan peringkat

Posting pertama dari seri menghasilkan leaderboard.

Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes
Pengoptimal
sumber
Lebar pintu tampaknya agak arbitrer bagi saya - mengapa 1 dalam N=1kasus ini? Mengapa tidak 3 dan memiliki jendela samping yang lebih kecil seperti dalam N=2kasing?
Matty
Juga, dalam hal N=1ini, bukankah atap pertama terlalu panjang (lebar)?
Matty
@Matty mengenai pintu - jika pintu lebar 3, maka tidak akan ada #di samping .untuk mendukung ]dan [di atasnya. Tentang ukuran atap awal - Itulah ukuran atap di setiap atap bagian atas.
Pengoptimal
Saya bertanya tentang atap paling bawah tepat di atas jendela. Dalam semua kasus lain ukuran atap di atasnya +4 (+2 di kedua sisi). Tapi ini +8.
Matty
@Atty oh, kamu benar. Tetap.
Pengoptimal

Jawaban:

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}%

Baris baru ditambahkan untuk menghindari pengguliran. Cobalah online

Penjelasan singkat:

Program membangun separuh kiri kuil (termasuk tengah), lalu membalikkannya dan menggantikan beberapa karakter untuk mendapatkan setengah yang tepat. Serangkaian n spasi direpresentasikan sebagai angka ~ n (bitwise "not") selama konstruksi, dan diganti dengan spasi aktual di akhir.

Program ini dimulai dengan 2 baris teratas, kemudian untuk setiap tingkat atap, program ini menambahkan semua baris sebelumnya dengan 2 spasi dan menambahkan atap baru (2 baris). Atap terakhir dimodifikasi untuk menambahkan bagian "pintu atas".

Selanjutnya, dinding atas dibangun dengan mengulangi "| __" dan memotong pada panjang yang tepat, diikuti oleh "_ |" yang telah diperbaiki. dan spasi. Dinding kemudian digandakan dan ruang pintu diganti dengan garis bawah. Akhirnya, bagian bawah dibangun garis demi garis.

aditsu
sumber
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)

Coba saya .

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));}

Coba saya .

JavaScript, 365

Di atas dapat diterjemahkan hampir 1 ke 1 ke dalam 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));}

Menggunakan:

f(2);console.log(r)
nutki
sumber
Versi C mogok untuk ukuran di atas 12. Karena sepertinya Anda menggunakan string ukuran tetap untuk menyimpan hasil sementara, saya pikir Anda akan selalu memiliki batas atas, tidak peduli bagaimana Anda memilih ukuran s. Kecuali Anda mengalokasikannya secara dinamis, tentu saja.
Reto Koradi
@RetoKoradi, Ya Anda benar, saya memposting versi dengan penyangga kecil karena kesalahan. Tetapi pada akhirnya, kecuali jika dialokasikan secara dinamis akan selalu ada batasnya.
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)

Ini pada dasarnya membangun garis kuil demi baris. Fungsi pmencetak string dengan spasi yang dibutuhkan untuk memusatkannya.

Saya menggunakan python 2 untuk menyimpan banyak byte, karena objek peta python 3 tidak memicu. Saya kira saya harus selalu golf di python 2 , hanya menghemat beberapa byte lagi (bahkan jika itu hanya untuk tidak perlu menguraikan input ke int). Hehehe, ini tidak seperti kode cantik untuk bermain golf.

Edit: dan tentu saja, sekarang saya tidak membutuhkan peta lagi ...

Berikut kode dalam bentuk ungolfed:

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) + '\\')
Matty
sumber
1
Karena Anda menggunakan Python 2, Anda dapat mengubahnya print(B*(5+2*n-len(s)//2)+s)menjadi print B*(5+2*n-len(s)/2)+s(menghapus tanda kurung dan mengubahnya //menjadi /).
user12205
1
Terima kasih @ace, tidak tahu python2 mengabaikan divisi float.
Matty
1
@Matty Ini tidak mengabaikan divisi float. Anda melakukan pembagian integer , jadi hasilnya adalah integer. Hanya divisi float jika satu atau lebih operan adalah float.
mbomb007
2
Jika Anda mengatur ulang urutan print B*(5+2*n-len(s)/2)+ske print(5+2*n-len(s)/2)*B+s, Anda dapat menghapus spasi setelahnya print.
isaacg
4

JavaScript ( ES6 ), 440

Edit bug lintel yang diperbaiki

Sebuah fungsi dengan tinggi sebagai parameter, output ke konsol.

Menggunakan string template banyak , semua baris baru signifikan dan dihitung.

Jalankan cuplikan untuk menguji di Firefox (dengan output konsol)

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

Versi ungolfed untuk uji interaktif:

// 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>

edc65
sumber
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])
Damien
sumber
Ok terima kasih. Terlihat benar sekarang
Damien
Saya pikir tidak apa-apa sekarang. btw, pangkalan di N = 1 kuilmu memiliki satu lagi #
Damien
Yup, bekerja sekarang. Memperbaiki ekstra yang tidak diinginkan#
Pengoptimal
0

C, 660 byte

Pola ini sepertinya terlalu tidak teratur untuk menghasilkan sesuatu yang mewah, terutama dalam bahasa tanpa pemrosesan string. Jadi inilah pendekatan brute force saya:

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");}

Sebelum bermain 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;
}

Tidak banyak yang bisa dijelaskan di sini. Itu hanya berjalan baris demi baris, dan menghasilkan hitungan yang diperlukan dari setiap karakter. Saya mencoba untuk menjaga kode itu sendiri tetap ringkas, tetapi masih bertambah. dadalah lebar pintu, wlebar setiap dinding bata.

Reto Koradi
sumber
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