ASCII Günün Sanatı # 3 - Çin Türbeleri


16

Bugünkü AAOD bölümünde, farklı yüksekliklerde bir Çin Tapınağı inşa edeceğiz.

Height ( N) 1için aşağıdaki örnekleri göz önünde bulundurun6

N = 1:

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

N = 2:

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

N = 3:

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

N = 4:

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

N = 5:

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

N = 6:

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

ve bunun gibi.

İnşaat Detayları

Desenle ilgili ayrıntıların çoğunun açık olduğundan eminim. İşte bazı ince detaylar:

  • Türbenin altındaki kapı minimum 1 _genişlikte ve maksimum 5 _genişlikte olabilir.
  • .Kapının etrafındaki direklerin üzerinde her zaman iki tane olacaktır (iki dikey |).
  • Merdivenler kapı ile aynı genişlikte başlar ve desendeki şov gibi yükselir
  • ]##..##[Her bir çatı seviyesinden blok büyüklüğünde artış 2üstten alta.
  • \__...__/Çatılar seviyeleri büyüklüğünde artış 4yukarıdan aşağıya kadar.
  • Kapının etrafındaki duvar blokları en az ikisi arasında 1 _ve en fazla 3 _ikisi arasında olmalıdır |. Öncelik dış duvar bloklarına gider, böylece kapıya en yakın olanı her seviye için değişen bir boyut alır.
  • Arasındaki boşluk .ve ](veya [) ile doldurulur #, sadece kapı üstünde çatı.

Zorluk Ayrıntıları

  • 0STDIN / ARGV / fonksiyon argümanı veya en yakın eşdeğerinden daha yüksek bir pozitif tam sayı okuyan ve NÇin Tapınağı'nın (STDOUT veya en yakın eşdeğeri) çıkışlarını içeren bir işlev veya tam program yazın
  • Sondaki satır başı isteğe bağlıdır.
  • Çıktıyı minimum sınırlama dikdörtgeni içine yerleştirmek için ya boşluk ya da yeterli boşluk olmamalıdır.
  • Desenin parçası olmayan önde gelen boşluklar olmamalıdır.

Liderler Sıralaması

Serinin ilk yazısı bir skor tablosu oluşturur.

Yanıtlarınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak her cevaba bir başlık ile başlayın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Kapı genişliği benim için oldukça keyfi görünüyor - neden bu N=1durumda 1 ? Neden 3 değil ve N=2kasadaki gibi daha küçük yan pencereler var ?
Matty

Ayrıca, N=1durumda, ilk çatı çok uzun (geniş) değil mi?
Matty

@Matty ilgili kapı - Kapı 3 genişliği ise, o zaman olacağını #yanında .desteklemek için ]ve [yukarıda. Başlangıç ​​çatı boyutu hakkında - Bu, her yüksekliğin üst çatısındaki çatı boyutudur.
Doktor,

Ben pencerelerin hemen üstünde en alt çatı hakkında soruyordu. Diğer tüm durumlarda, üstündeki çatının +4 boyutudur (her iki tarafta +2). Ama burada +8.
Matty

@Matty oh, haklısın. Sabit.
Doktor,

Yanıtlar:


2

CJam, 200 bayt

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

Kaymayı önlemek için yeni satırlar eklendi. Çevrimiçi deneyin

Kısa açıklama:

Program, türbenin sol yarısını (orta da dahil olmak üzere) oluşturur, sonra tersine çevirir ve sağ yarıyı almak için bazı karakterleri değiştirir. Bir dizi n boşluk inşaat sırasında ~ n (bitsel "değil") olarak temsil edilir ve sonunda gerçek boşluklarla değiştirilir.

Program ilk 2 satırla başlar, daha sonra her çatı seviyesi için önceki tüm satırları 2 boşlukla doldurur ve yeni çatıyı (2 satır) ekler. Son çatı, "kapı üstü" kısmı eklenecek şekilde değiştirilir.

Sonra, üst duvar "| __" tekrarlanarak ve doğru uzunlukta kesilerek, ardından sabit bir "_ |" ve boşluklar. Duvar daha sonra çoğaltılır ve kapı boşlukları alt çizgi ile değiştirilir. Son olarak, alt kısım satır satır oluşturulur.


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)

Beni dene .

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

Beni dene .

JavaScript, 365

Yukarıdakiler neredeyse 1'e 1 olarak JavaScript'e çevrilebilir:

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

kullanın:

f(2);console.log(r)

C sürümü, 12'nin üzerindeki boyutlar için kilitleniyor. Geçici sonuçları tutmak için sabit boyutlu bir dize kullandığınızdan, boyutunu nasıl seçerseniz seçin, her zaman bir üst sınırınız olacağını düşünüyorum s. Elbette dinamik olarak ayırmazsanız.
Reto Koradi

@RetoKoradi, Evet haklısın, yanlışlıkla küçük bir arabellekli sürüm yayınladım. Ama sonunda, dinamik olarak tahsis edilmedikçe, her zaman bir sınır olacaktır.
nutki

4

Piton 2, 356 352 347 344 bayt

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)

Bu temelde türbeyi satır satır inşa eder. İşlev p, ortalamak için gereken boşlukları içeren bir dize yazdırır.

Kullandığım piton 2 çünkü bayt çok kaydetmek için piton 3 harita nesne tetikleyici değildir. Sanırım ben her zaman python 2 golf gerekir , sadece birkaç bayt kaydeder (sadece int giriş ayrıştırmak zorunda olmasa bile). Hehehe, bu kod ilk etapta golf oynamak için hoş değil.

Düzenleme: ve tabii ki, artık haritaya ihtiyacım yok ...

İşte kodlanmamış formda kod:

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
Python 2 kullandığınız için değiştirebileceğiniz print(B*(5+2*n-len(s)//2)+s)içine print B*(5+2*n-len(s)/2)+s(remove parantez ve değişim //içine /).
user12205

1
Teşekkürler @ace, python2 float bölümünü göz ardı etmediğini bilmiyordum.
Matty

1
@Matty Şamandıra bölümünü göz ardı etmez. Tamsayılarda bölünme gerçekleştiriyorsunuz , sonuç bir tamsayı. Sadece bir veya daha fazla işlenen bir kayan nokta ise şamandıra bölümü yapar.
mbomb007

2
Eğer sırasını yeniden Eğer print B*(5+2*n-len(s)/2)+süzere print(5+2*n-len(s)/2)*B+s, sen sonra boşluk kaldırabilirsiniz print.
isaacg

4

JavaScript ( ES6 ), 440

Sabit lento hatasını düzenle

Bir parametre olarak yüksekliği olan bir fonksiyon, konsola çıktı.

Şablon dizgisini çok kullanarak , tüm yeni satırlar önemlidir ve sayılır.

Firefox'ta test etmek için snippet'i çalıştırın (konsol çıkışı ile)

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

Etkileşimli test için yönlendirilmemiş sürüm:

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

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

Tamam teşekkürler. Şimdi doğru görünüyor
Damien

Sanırım şimdi sorun değil. btw, N = 1 türbenizdeki üs bir tane daha var #
Damien

Yup, şimdi çalışıyor. Ekstra istenmeyen bu sorun giderildi#
Optimizer

0

C, 660 bayt

Desen, özellikle dize işlemesi olmayan bir dilde, fantezi bir şey bulmak için çok düzensiz görünüyordu. İşte kaba kuvvet yaklaşımım:

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

Golf oynamadan önce:

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

Burada açıklanacak fazla bir şey yok. Sadece satır satır gider ve her karakterin gerekli sayısını üretir. Kodun kendisini kompakt tutmaya çalıştım, ama yine de ekliyor. dkapının wgenişliği, her tuğla duvarın genişliği.


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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.