Dessinons la Triforce

29

La Triforce est un artefact fictif dans The Legend of Zelda , composé de trois triangles équilatéraux d'aspect identique représentant la puissance, la sagesse et le courage. Plusieurs jeux de la saga incluent une animation lorsque les trois parties se rejoignent enfin.

Le but de ce défi est de dessiner une seule image 2D d'une telle animation simplifiée, avec une largeur donnée pour les triangles et un espacement donné entre les pièces.

Contribution

L'entrée se compose de deux nombres entiers: une largeur et une valeur d'espacement .s 0w1s0

Sortie

Le cadre doit être dessiné selon les spécifications suivantes:

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

Dans l'exemple ci-dessus, nous avons et .s = 2w=3s=2

Plus d'exemples

w=1 , :s=0

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

s = 0w=2 , :s=0

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

s = 3w=3 , :s=3

          /\          
         /  \         
        /    \        
       /______\       



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

s = 1w=4 , :s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Règles

  • Les espaces de fin sur chaque ligne sont facultatifs.
  • Les espaces de tête supplémentaires sur chaque ligne ne sont pas autorisés.
  • Vous pouvez sortir une seule nouvelle ligne supplémentaire et / ou une seule nouvelle ligne supplémentaire.
  • C'est du .
Arnauld
la source

Réponses:

10

Python 2 , 197 194 169 169 167 155 144 octets

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)

Essayez-le en ligne!


Enregistré:

  • -3 octets, merci à M. Xcoder
TFeld
la source
8

Fusain , 25 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

←×_N

Entrer wet dessiner w _s.

↗⊕θ

Dessinez w+1 /s.

‖M

Réfléchissez pour terminer le premier triangle.

≔⁺⊕θNη

Saisissez set calculez le décalage entre les triangles gauche et central.

Cη±η

Copiez le triangle gauche au milieu.

‖BO⊗⊕θ

Réfléchissez autour du triangle central pour compléter la triforce.

Neil
la source
Euh, vérifiez vos calculs là-dessus. Il peut s'agir de 25 caractères , mais de 50 à 65 octets (selon que vous utilisez respectivement la représentation UTF-16 ou UTF-8).
Stuart P. Bentley
Ma faute; apparemment, Charcoal et Canvas ont leurs propres mappages de caractères , ce qui me semble un peu idiot (si vous utilisez des symboles arbitraires, pourquoi ne pas utiliser une sélection existante), mais peu importe.
Stuart P. Bentley
@ StuartP.Bentley Le but de ce site est la taille du programme de golf. De nombreuses langues (il y en a beaucoup, beaucoup plus que Canvas & Charcoal) ont opté pour l'utilisation des 8 bits par octet, car c'est un très bon moyen de se rapprocher du maximum de golf. Le joli unicode est juste pour rendre le code plus facile à lire et à écrire (vous essayez de programmer en C en écrivant du bytecode; nous sommes aussi des humains)
dzaima
8

Python 2 , 127 124 octets

w,s=input()
n=2*-~w+s
while n:n-=1;I=w-n+(n>w)*(w-~s);print' '*n+('  '*(n+s)).join(['/'+I*2*' _'[I>=w]+'\\'][I>w:]*-~(n<=w))

Essayez-le en ligne!

ovs
la source
7

Toile , 20 19 16 octets

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

Essayez-le ici!

Explication:

+├                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

note: en faisant cela, j'ai corrigé une erreur dans le code, sans ce correctif, ce serait 18 octets .

dzaima
la source
Comme la réponse de Neil , cela peut être 16 caractères , mais en termes Unicode, c'est soit 32 ou 44 octets, selon l'UTF que vous utilisez. (J'ai considéré qu'il pourrait être représentable dans un jeu de caractères à un octet hérité comme la page de code 437 , mais il n'y a pas de ω ou ⁸ disponible, il me semble donc que vous devriez opter pour un format de transformation Unicode.)
Stuart P. Bentley
@ StuartP.Bentley Canvas utilise une page de code personnalisée, comme liée dans le titre de mon article. Le wiki github pour Charcoal contient également sa page de code. Il est convenu sur PPCG qu'il est correct de répondre avec des réponses au format Unicode s'il y a une page de code / convertisseur le sauvegardant.
dzaima
Tcsh, d'accord (bien qu'au moment où vous utilisez des convertisseurs arbitraires, il me semble que vous pourriez aussi bien écrire dans un langage avec des noms complets et mesurer une longueur d'instruction de bytecode VM compilée).
Stuart P. Bentley
@ StuartP.Bentley Vérifiez le lien des réponses au charbon - il contient un code lisible par l'homme! (donc oui, 2 transpilations: p) Les gens ici répondent dans le scoring d'assemblage en tant que code machine, donc il n'y a aucune raison de répondre aussi dans les machines virtuelles
dzaima
7

R , 225 , 224 , 214 , 211 , 208 octets

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

Essayez-le en ligne!

  • -1 octet grâce à Giuseppe
  • -10 octets après changement d'approche
  • -3 octets expliquant le code ASCII
  • -3 octets grâce à JayCe
digEmAll
la source
Comme je n'ai rien trouvé à ajouter à cela ... J'ai juste renommé les variables et je suggère également une autre voie pour revenir en silence ... que je ne suis pas complètement satisfait de TBH. Continuera à chercher! TIO
JayCe
oh attendez ... if(F)0est sûr à coup sûr et enregistre un octet. Ou encore mieux rm()pour 3 octets.
JayCe
Ma suggestion à utiliser q()dans mon premier commentaire n'est pas valide selon cette méta
JayCe
@JayCe: super astuce en utilisant rm ()!
digEmAll
4

Pascal (FPC) , 296 264 octets

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.

Essayez-le en ligne!

AlexRacer
la source
4

Python 2 , 256 248 240 228 199 195 195 octets

Un programme plus long, mais une approche légèrement différente:

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

Essayez-le en ligne!


économisé beaucoup d'octets grâce à l'ignorance des espaces de fin et à l'incorporation de quelques astuces de @ovs
encore plus en définissant une variable plus tôt

micsthepick
la source
Je
devrai
218 octets .
Jonathan Frech
c'était un sous-produit de quand il y en avait deux
micsthepick
3

Rubis , 126 octets

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

Essayez-le en ligne!

Level River St
la source
2

Retina 0.8.2 , 141 octets

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

Essayez-le en ligne! Remarque: certains espaces en fin de sortie. Explication:

\d+
$* 

Convertissez les entrées en espaces. (La deuxième ligne se termine par un espace.)

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

Créez les côtés des deux triangles inférieurs avec l'espacement approprié.

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

Remplissez la base des triangles.

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

Dupliquez les triangles avec l'espacement vertical approprié.

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

Convertissez les triangles supérieurs en un seul triangle centré.

Neil
la source
2

C (gcc), 404 389 octets

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

Essayez-le en ligne!

-14 octets de Rodolvertice

-1 octet en fixant une décrémentation variable de boucle

barré 404 est presque toujours 404

Non golfé:

#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
la source
1
#define f for enregistre quelques octets
rodolphito
Tu ne peux pas faire #define p putchar?
RK.
1
@RK. Si je le faisais, je devrais utiliser à la p(x);place de p(x), pour (+26, -6) = +20 octets. Le point-virgule est inclus lorsque la macro est développée.
pizzapants184
284 octets
Plafond