ASCII Kunst des Tages # 3 - Chinesische Schreine

16

In der heutigen Folge von AAOD werden wir einen chinesischen Schrein unterschiedlicher Höhe bauen.

Betrachten Sie die folgenden Beispiele für height ( N) 1bis6

N = 1:

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

N = 2:

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

N = 3:

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

N = 4:

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

N = 5:

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

N = 6:

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

und so weiter.

Konstruktionsdetails

Ich bin sicher, dass die meisten Details des Musters klar sind. Hier einige Details:

  • Die Tür am Boden des Schreins kann mindestens 1 _breit und höchstens 5 _breit sein.
  • Es gibt immer zwei .direkt über den Säulen um die Tür (zwei vertikal |).
  • Die Treppe beginnt mit der gleichen Breite wie die Tür und steigt wie im Muster gezeigt an
  • Die ]##..##[Blöcke über jeder Dachebene vergrößern sich 2von oben nach unten.
  • Die \__...__/Dachebenen vergrößern sich 4von oben nach unten.
  • Die Wandblöcke um die Tür sollten mindestens 1 _und höchstens 3 _zwischen den beiden liegen |. Priorität haben die äußeren Wandblöcke, sodass derjenige, der der Tür am nächsten liegt, für jede Ebene eine unterschiedliche Größe erhält.
  • Der Raum zwischen .und ](oder [) wird #im Dach direkt über den Türen ausgefüllt .

Herausforderungsdetails

  • Schreiben Sie eine Funktion oder ein vollständiges Programm, das eine positive Ganzzahl größer als 0über das Argument STDIN / ARGV / function oder das nächstgelegene Äquivalent liest und (an STDOUT oder das nächstgelegene Äquivalent) das Nchinesische Heiligtum ausgibt
  • Der Zeilenumbruch ist optional.
  • Es sollten entweder keine oder genügend Leerzeichen vorhanden sein, um die Ausgabe im minimalen Begrenzungsrechteck aufzufüllen.
  • Es sollten keine führenden Leerzeichen vorhanden sein, die nicht Teil des Musters sind.

Bestenliste

Der erste Beitrag der Serie generiert eine Rangliste.

Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby, <s>104</s> <s>101</s> 96 bytes
Optimierer
quelle
Die Türbreite erscheint mir eher willkürlich - warum ist es in dem N=1Fall 1? Warum nicht 3 und haben kleinere Seitenfenster wie im N=2Fall?
Matty
Ist in diesem N=1Fall auch das erste Dach nicht zu lang (breit)?
Matty
@Matty in Bezug auf Tür - Wenn die Tür die Breite 3 hätte, gäbe es keine #neben .der ]und [darüber zu stützen . Über die Startdachgröße - Das ist die Dachgröße im oberen Dach jeder Höhe.
Optimierer
Ich fragte nach dem untersten Dach direkt über den Fenstern. In allen anderen Fällen ist es die Größe des Daches darüber +4 (+2 auf beiden Seiten). Aber hier ist es +8.
Matty
@Matty oh, du hast recht. Fest.
Optimierer

Antworten:

2

CJam, 200 Bytes

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

Zeilenumbrüche hinzugefügt, um ein Scrollen zu vermeiden. Probieren Sie es online aus

Kurze Erklärung:

Das Programm erstellt die linke Hälfte des Schreins (einschließlich der mittleren), kehrt sie dann um und ersetzt einige Zeichen, um die rechte Hälfte zu erhalten. Eine Reihe von n Leerzeichen wird während der Konstruktion als Zahl ~ n (bitweise "nicht") dargestellt und am Ende durch die tatsächlichen Leerzeichen ersetzt.

Das Programm beginnt mit den obersten 2 Zeilen, stellt dann für jede Dachebene alle vorherigen Zeilen mit 2 Leerzeichen voran und fügt das neue Dach hinzu (2 Zeilen). Das letzte Dach wird modifiziert, um den Teil "über der Tür" hinzuzufügen.

Als nächstes wird die obere Wand gebaut, indem "| __" wiederholt und auf die richtige Länge gekürzt wird, gefolgt von einem festen "_ |" und Räume. Die Wand wird dann dupliziert und die Türbereiche durch Unterstriche ersetzt. Schließlich wird der untere Teil Zeile für Zeile aufgebaut.

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

Versuch es mit mir .

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

Versuch es mit mir .

JavaScript, 365

Das obige kann fast 1 zu 1 in JavaScript übersetzt werden:

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

Verwenden:

f(2);console.log(r)
nutki
quelle
Die C-Version stürzt bei Größen über 12 ab. Da Sie anscheinend eine Zeichenfolge mit fester Größe verwenden, um temporäre Ergebnisse zu speichern, haben Sie immer eine Obergrenze, unabhängig davon, wie Sie die Größe auswählen s. Es sei denn, Sie ordnen es dynamisch zu.
Reto Koradi
@RetoKoradi, ja du hast recht, ich habe versehentlich eine Version mit einem kleinen Puffer gepostet. Aber am Ende wird es immer ein Limit geben, es sei denn, es wird dynamisch zugewiesen.
Nutki
4

Python 2, 356 352 347 344 Bytes

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)

Dies baut den Schrein im Grunde Linie für Linie auf. Die Funktion pdruckt eine Zeichenfolge mit den Leerzeichen, die zum Zentrieren erforderlich sind.

Ich habe Python 2 verwendet , um viele Bytes zu speichern, da das Python 3- Map-Objekt nicht ausgelöst wird. Ich denke, ich sollte immer in Python 2 Golf spielen , spart nur ein paar Bytes mehr (auch wenn es nur darum geht, die Eingabe nicht in int zu analysieren). Hehehe, es ist nicht so, als wäre Code in erster Linie schön zum Golfen.

Edit: und natürlich brauche ich die Map jetzt nicht mehr ...

Hier ist der Code in ungolfed Form:

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
quelle
1
Da Sie Python verwenden 2 können Sie ändern print(B*(5+2*n-len(s)//2)+s)in print B*(5+2*n-len(s)/2)+s(Entfernen Klammern und Änderung //in /).
user12205
1
Danke @ace, wusste nicht, dass Python2 Float Division ignoriert.
Matty
1
@Matty Float Division wird nicht ignoriert. Sie führen eine Division für ganze Zahlen durch , das Ergebnis ist also eine ganze Zahl. Float Division wird nur ausgeführt, wenn ein oder mehrere Operanden float sind.
mbomb007
2
Wenn Sie die Reihenfolge von print B*(5+2*n-len(s)/2)+sbis print(5+2*n-len(s)/2)*B+sändern, können Sie das Leerzeichen danach entfernen print.
isaacg
4

JavaScript ( ES6 ), 440

Bearbeiten Behobener Sturzfehler

Eine Funktion mit der Höhe als Parameter, die an die Konsole ausgegeben wird.

Mit Vorlage Zeichenfolge viel , sind alle Zeilenumbrüche signifikant und gezählt.

Führen Sie das Snippet aus, um es in Firefox zu testen (mit Konsolenausgabe)

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

Ungolfed- Version für interaktiven Test:

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

Haskell, 473 Bytes

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
quelle
OK danke. Sieht jetzt richtig aus
Damien
Ich denke, es ist jetzt in Ordnung. Übrigens hat die Basis in Ihrem N = 1-Schrein noch einen #
Damien
Ja, funktioniert jetzt. Das Problem wurde behoben#
Optimizer
0

C 660 Bytes

Das Muster schien einfach zu unregelmäßig zu sein, um sich etwas Besonderes einfallen zu lassen, insbesondere in einer Sprache ohne Zeichenkettenverarbeitung. Also hier ist mein Brute-Force-Ansatz:

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

Vor dem Golfen:

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

Hier gibt es nicht viel zu erklären. Es geht nur Zeile für Zeile und generiert die erforderliche Anzahl jedes Zeichens. Ich habe versucht, den Code selbst kompakt zu halten, aber es summiert sich immer noch. dist die Breite der Tür, wdie Breite jeder Mauer.

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