Lassen Sie uns die Triforce zeichnen

29

Die Triforce ist ein fiktives Artefakt in The Legend of Zelda , das aus drei gleich aussehenden gleichseitigen Dreiecken besteht, die für Macht, Weisheit und Mut stehen. Einige Spiele in der Saga enthalten eine Animation, wenn die drei Teile schließlich zusammengefügt werden.

Der Zweck dieser Herausforderung besteht darin, einen einzelnen 2D-Frame einer solchen vereinfachten Animation mit einer bestimmten Breite für die Dreiecke und einem bestimmten Abstand zwischen den Teilen zu zeichnen.

Eingang

Die Eingabe besteht aus zwei ganzen Zahlen: einer Breite und einem Abstandswert .w1s0

Ausgabe

Der Rahmen muss gemäß den folgenden Spezifikationen gezeichnet werden:

         /\
        /  \____________ this part is horizontally centered
       /    \
      /______\
                    \___ s empty lines
                    /
   /\          /\
  /  \        /  \______ w+1 backslashes
 /    \      /    \
/______\    /______\
                \_______ 2w underscores
        |__|
          \_____________ 2s spaces

Im obigen Beispiel haben wir und .w=3s=2

Mehr Beispiele

s = 0w=1 , :s=0

   /\   
  /__\  
 /\  /\ 
/__\/__\

, s = 0 :w=2s=0

     /\     
    /  \    
   /____\   
  /\    /\  
 /  \  /  \ 
/____\/____\

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



   /\            /\   
  /  \          /  \  
 /    \        /    \ 
/______\      /______\

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

    /\          /\    
   /  \        /  \   
  /    \      /    \  
 /      \    /      \ 
/________\  /________\

Regeln

  • Nachgestellte Leerzeichen in jeder Zeile sind optional.
  • Zusätzliche führende Leerzeichen in jeder Zeile sind nicht zulässig.
  • Sie können eine einzelne zusätzliche führende Zeile und / oder eine einzelne zusätzliche nachfolgende Zeile ausgeben.
  • Das ist .
Arnauld
quelle

Antworten:

10

Python 2 , 197 194 169 167 155 144 Bytes

w,s=input()
l=['']*(2*-~w+s)
for i in range(-~w):W=w-i;b='/'+'_ '[i<w]*2*i+'\\';l[i::w-~s]=' '*(w+s-~W)+b,' '*W+b+'  '*(W+s)+b
print'\n'.join(l)

Probieren Sie es online!


Gerettet:

  • -3 Bytes, danke an Herrn Xcoder
TFeld
quelle
8

Holzkohle , 25 Bytes

←×_N↗⊕θ‖M≔⁺⊕θNηCη±η‖BO⊗⊕θ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

←×_N

Geben Sie ein wund zeichnen Sie w _s.

↗⊕θ

Zeichnen w+1 /s.

‖M

Nachdenken, um das erste Dreieck zu vervollständigen.

≔⁺⊕θNη

Geben Sie sden Versatz zwischen dem linken und dem mittleren Dreieck ein und berechnen Sie ihn.

Cη±η

Kopieren Sie das linke Dreieck in die Mitte.

‖BO⊗⊕θ

Reflektiere um das mittlere Dreieck, um die Triforce zu vervollständigen.

Neil
quelle
Äh, überprüfe deine Mathematik. Dies können 25 Zeichen sein , aber es sind 50 bis 65 Bytes (abhängig davon, ob Sie eine UTF-16- oder eine UTF-8-Darstellung verwenden).
Stuart P. Bentley
Mein Fehler; Anscheinend haben Charcoal und Canvas ihre eigenen Charakterzuordnungen , was mir etwas albern vorkommt (wenn Sie beliebige Symbole verwenden, warum nicht eine vorhandene Auswahl verwenden), aber was auch immer.
Stuart P. Bentley
@ StuartP.Bentley Der Punkt auf dieser Seite ist die Größe des Golfprogramms. Viele Sprachen (es gibt viele, viele mehr als nur Canvas & Charcoal) haben sich für die Verwendung aller 8 Bits pro Byte entschieden, da dies ein sehr guter Weg ist, um der maximalen Golffreundlichkeit näher zu kommen. Der hübsche Unicode dient nur dazu, das Lesen und Schreiben von Code zu vereinfachen (Sie versuchen, in C zu programmieren, indem Sie Bytecode schreiben; wir sind auch Menschen)
dzaima
7

Canvas , 20 - 19 - 16 Bytes

+├:⁸╵\L_×;∔║ω╋║↕

Probieren Sie es hier aus!

Erläuterung:

+├                s + w + 2
  :               duplicated (for both X & Y)
   ⁸╵\            w+1 sized diagonal
      L_×         "_"*width of the diagonal
         ;∔       prepended before the diagonal
           ║      palindromize that
            ω     and push the argument of ║ (aka the unpalindromized version)
             ╋    overlap the upside down half-triangle over the upside down triangle at (s+w+2; s+w+2)
              ║   and palindromize the whole thing
               ↕  reverse everything vertically

Hinweis: Bei der Erstellung dieses Dokuments habe ich einen Fehler im Code behoben. Ohne dieses Update wären dies 18 Byte .

dzaima
quelle
Wie Neils Antwort kann dies 16 Zeichen sein , aber in Unicode ausgedrückt sind es entweder 32 oder 44 Byte, abhängig davon, welches UTF Sie verwenden. (Ich dachte, dass es in einem alten Einzelbyte-Zeichensatz wie Codepage 437 darstellbar sein könnte , aber dort ist kein ω oder ⁸ verfügbar, daher müsste man meines Erachtens mit einem Unicode-Transformationsformat arbeiten.)
Stuart P. Bentley
@ StuartP.Bentley Canvas verwendet eine benutzerdefinierte Codepage, wie im Titel meines Beitrags verlinkt. Das Github-Wiki für Charcoal enthält auch seine Codepage. Bei PPCG ist man sich einig, dass es in Ordnung ist, mit Unicode-formatierten Antworten zu antworten, wenn eine Codepage / ein Konverter vorhanden ist, die / der diese / n sichert.
Dzaima
Tcsh, okay (obwohl an dem Punkt, an dem Sie beliebige Konverter verwenden, scheint es mir, dass Sie genauso gut in einer Sprache mit vollständigen Namen schreiben und eine kompilierte VM-Bytecode-Anweisungslänge messen).
Stuart P. Bentley
@ StuartP.Bentley Überprüfen Sie den Link Charcoal answers - er enthält von Menschen lesbaren Code! (also ja, 2 Transpilationen: p) Die Leute hier antworten in der Assemblerwertung als Maschinencode, es gibt also keinen Grund, auch in VMs zu antworten
dzaima
7

R , 225 , 224 , 214 , 211 , 208 Bytes

function(w,s){M=matrix
C=cbind
h=w+1
k=C(apply(m<-diag(h)*60,1,rev)/4,m)
k[row(k)==h&!k]=63
z=rbind(C(a<-M(0,h,h+s),k,a),M(0,s,h*4+2*s),C(k,M(0,h,2*s),k))
z[]=intToUtf8(z+32,T)
apply(z,1,cat,sep='','
')
rm()}

Probieren Sie es online!

  • -1 Byte danke an Giuseppe
  • -10 Bytes nach Änderung der Annäherung
  • -3 Bytes für ASCII-Code
  • -3 Bytes dank JayCe
digEmAll
quelle
Da ich nichts gefunden habe, was ich hinzufügen könnte ... Ich habe die Variablen umbenannt und schlage auch eine andere Möglichkeit vor, um stillschweigend zurückzukehren ... was ich mit TBH nicht ganz zufrieden bin. Ich werde weiter suchen! TIO
JayCe
oh warte ... if(F)0ist mit Sicherheit akzeptabel und spart ein Byte. Oder noch besser rm()für 3 Bytes.
JayCe
Mein Vorschlag, q()in meinem ersten Kommentar zu verwenden, ist gemäß diesem Meta
JayCe
@ JayCe: toller Trick mit rm ()!
digEmAll
4

Pascal (FPC) , 296 264 Bytes

const A='/';B='\';var w,s,i:word;u:string;begin read(w,s);u:=StringOfChar('_',2*w);for i:=1to w do writeln(A:w+3+s+w-i,B:i*2-1);writeln(A:w+2+s,u,B);for i:=1to s do writeln;for i:=1to w do writeln(A:w+2-i,B:i*2-1,A:2*(s+w-i)+3,B:i*2-1);write(A,u,B,A:2*s+1,u,B)end.

Probieren Sie es online!

AlexRacer
quelle
4

Python 2 , 256 248 240 228 199 195 Bytes

Ein längeres Programm, aber etwas anderer Ansatz:

f,b,o='/\ '
O=o*2
w,s=input()
l=f+'__'*w+b
a=l+O*s+l
m=n=[]
p=lambda g:(len(a)-len(g))/2*o+g
for i in range(w):m=m+[p(f+O*i+b)];t=f+O*i+b;n+=p(t+O*(w-i+s)+t),
print'\n'.join(m+[p(l)]+[o]*s+n+[a])

Probieren Sie es online!


Durch das Ignorieren des nachgestellten Leerzeichens und das Einbeziehen einiger Tricks aus @ovs,
die durch die frühere Definition einer Variablen noch mehr gespart wurden, konnten viele Bytes gespart werden

micsthepick
quelle
Ich werde das morgen reparieren müssen (es funktioniert, aber ich kann es besser machen)
micsthepick
218 Bytes .
Jonathan Frech
216 Bytes
OVS
Das war ein Nebenprodukt aus , wenn gab es zwei
micsthepick
3

Ruby , 126 Bytes

->w,s{(-v=w+1).upto(v){|i|j= ~-i%-~v;$><<[$/*s,$/+' '*(v+s)+t="/#{(j<w ?' ':?_)*j*2}\\".center(w*2+2)+' '*s*2,$/+t*2][0<=>i]}}

Probieren Sie es online!

Level River St
quelle
2

Retina 0.8.2 , 141 Bytes

\d+
$* 
(?=( *),( *))
¶$1/$`$`\$1$2$2$1/$`$`\
T` `\_`/ *\\(?=.*,)
s`¶(.*),( *)
$1¶$.2$*¶$1
\G(( *)/(  |__)*\\)\2(  )*\1 *¶
$2 $#3$* $#4$* $1¶

Probieren Sie es online! Hinweis: Einige nachgestellte Leerzeichen in der Ausgabe. Erläuterung:

\d+
$* 

Konvertieren Sie die Eingaben in Leerzeichen. (Die zweite Zeile endet mit einem Leerzeichen.)

(?=( *),( *))
¶$1/$`$`\$1$2$2$1/$`$`\

Erstellen Sie die Seiten der unteren beiden Dreiecke mit dem entsprechenden Abstand.

T` `\_`/ *\\(?=.*,)

Füllen Sie die Basis der Dreiecke aus.

s`¶(.*),( *)
$1¶$.2$*¶$1

Duplizieren Sie die Dreiecke mit dem entsprechenden vertikalen Abstand.

\G(( *)/(  |__)*\\)\2(  )*\1 *¶
$2 $#3$* $#4$* $1¶

Wandle die oberen Dreiecke in ein einzelnes zentriertes Dreieck um.

Neil
quelle
2

C (gcc) 404 - 389 Bytes

#define p(x)putchar(x);
#define F for
W;S;i;a=32;b=47;c=92;f(w,s){W=w,S=s;F(;w;--w){F(i=W+w+s+1;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)p(10)}F(i=W+s+1;i--;)p(a)p(b)F(i=0;i++-2*W;)p(95)p(c)F(;s--+1;)p(10)F(w=W;w;--w){F(i=w;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)F(i=w*2+S*2;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)p(10)}p(b)F(i=0;i++-2*W;)p(95)p(c)F(i=S*2;i--;)p(a)p(b)F(i=0;i++-2*W;)p(95)p(c)}

Probieren Sie es online!

-14 Bytes von Rodolvertice

-1 Byte durch Fixieren einer Dekrementierung der Schleifenvariablen

durchgestrichen 404 ist fast noch 404

Ungolfed:

#define p(x)putchar(x); // save 7 bytes per putchar call (+24, -182)
#define F for // save 2 bytes per for loop (+14, -28)
int W, S, i; // W is w backup, S is s backup, i is an counter variable;
int a = ' '; // save 1 byte per space printed (+5, -8) (use a instead of 32)
int b = '/'; // save 1 byte per slash printed (+5, -6) (use b instead of 47)
int c = '\\'; // save 1 byte per backslash printed (+5, -6) (use c instead of 92)
// This isn't worth it for '\n' (-5, +3) (10), or '_' (-5, +3) (95)
int f(int w, int s) {
    W = w; // Backup w and s, as we will modify them later, 
    S = s; // but will need their original values
    for(; w != 0; --w) { // Top triangle (not the bottom line)
        for(i = W+w+s+1; i != 0; --i) // leading spaces
            putchar(' ');
        putchar('/'); // left side of triangle
        for(i = 2*w; i != 2*W; ++i) // inner spaces
            putchar(' ');
        putchar('\\'); // right side of triangle
        putchar('\n'); // newline
    }
    for(i = W+s+1; i != 0; --i)
        putchar(' '); // leading spaces for the bottom line
    putchar('/'); // left side
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // the bottom line
    putchar('\\'); // right side
    for(; s-- + 1 != 0;)
        putchar('\n'); // newline after the bottom line and S empty lines
    for(w = W; w != 0; --w) { // Bottom triangles
        for(i = w; i != 0; --i)
            putchar(' '); // leading spaces
        putchar('/'); // left of left triangle
        for(i = w*2; i != 2*W; ++i)
            putchar(' '); // inside of left triangle
        putchar('\\'); // right of left triangle
        for(i = w*2+S*2; i != 0; --i)
            putchar(' '); // spaces between left and right triangles
        putchar('/');
        for(i = w*2; i != 2*W; ++i)
            putchar(' '); // inside of right triangle
        putchar('\\'); // right of right triangle
        putchar('\n'); // newline
    }
    putchar('//'); // left of left
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // bottom of left triangle
    putchar('\\'); // right of left
    for(i = S*2; i != 0; --i)
        putchar(' '); // space between triangles
    putchar('/'); // left of right
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // bottom of left triangle
    putchar('\\'); // right of right
}

Pizzapants184
quelle
1
#define f für spart ein paar Bytes
Rodolphito
Können Sie dies nicht tun #define p putchar?
RK.
1
@RK. In diesem Fall müsste ich p(x);anstelle von p(x)(+26, -6) = +20 Byte verwenden. Das Semikolon wird eingeschlossen, wenn das Makro erweitert wird.
Pizzapants184
284 Bytes
Ceilingcat