Vamos desenhar o Triforce

29

O Triforce é um artefato fictício em The Legend of Zelda , feito de três triângulos equilaterais de aparência idêntica, representando poder, sabedoria e coragem. Vários jogos da saga incluem uma animação quando as três partes finalmente se juntam.

O objetivo deste desafio é desenhar um único quadro 2D de uma animação tão simplificada, com uma determinada largura para os triângulos e um determinado espaçamento entre as partes.

Entrada

A entrada consiste em dois números inteiros: uma largura e um valor de espaçamento .s 0w1s0

Saída

O quadro deve ser desenhado de acordo com as seguintes especificações:

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

No exemplo acima, temos e .s = 2w=3s=2

Mais exemplos

s = 0w=1 , :s=0

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

s = 0w=2 , :s=0

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

s = 3w=3 , :s=3

          /\          
         /  \         
        /    \        
       /______\       



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

s = 1w=4 , :s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Regras

  • Os espaços à direita em cada linha são opcionais.
  • Espaços iniciais extras em cada linha não são permitidos.
  • Você pode gerar uma nova linha extra à frente e / ou uma nova linha extra à direita.
  • Isso é .
Arnauld
fonte

Respostas:

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)

Experimente online!


Salvou:

  • -3 bytes, graças ao Sr. Xcoder
TFeld
fonte
8

Carvão , 25 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

←×_N

Insira we desenhe w _s.

↗⊕θ

Desenhe w+1 /s.

‖M

Reflita para completar o primeiro triângulo.

≔⁺⊕θNη

Insira se calcule o deslocamento entre os triângulos esquerdo e médio.

Cη±η

Copie o triângulo esquerdo para o meio.

‖BO⊗⊕θ

Reflita em torno do triângulo do meio para completar a triforce.

Neil
fonte
Verifique suas contas sobre isso. Pode ter 25 caracteres , mas é de 50 a 65 bytes (dependendo de você usar a representação UTF-16 ou UTF-8, respectivamente).
Stuart P. Bentley
Minha culpa; aparentemente, Charcoal e Canvas têm seus próprios mapeamentos de caracteres , o que me parece um pouco tolo (se você usar símbolos arbitrários, por que não usar uma seleção existente), mas tanto faz.
Stuart P. Bentley
@ StuartP.Bentley O objetivo deste site é o tamanho do programa de golfe. Muitos idiomas (existem muitos, muito mais do que apenas o Canvas & Charcoal) optaram por utilizar todos os 8 bits por byte, pois essa é uma maneira muito boa de chegar mais perto da máxima golfabilidade. O unicode bonito é apenas para tornar o código mais fácil de ler e escrever (você tentar programar em C por escrever bytecode, somos seres humanos também)
dzaima
8

Python 2 , 127 124 bytes

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

Experimente online!

ovs
fonte
7

Tela , 20 19 16 bytes

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

Experimente aqui!

Explicação:

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

nota: ao fazer isso, corrigi um erro no código. Sem essa correção, isso seria 18 bytes .

dzaima
fonte
Como a resposta de Neil , podem ter 16 caracteres , mas em termos Unicode, são 32 ou 44 bytes, dependendo de qual UTF você usar. (Eu considerei que poderia ser representável em um conjunto de caracteres de byte legado como a página de código 437 , mas não há ω ou ⁸ disponível lá, então parece-me que você precisaria usar um formato de transformação Unicode.)
Stuart P. Bentley
O @ StuartP.Bentley Canvas usa uma página de código personalizada, conforme vinculada no título da minha postagem. O wiki do github para Charcoal também contém sua página de códigos. Está acordado no PPCG que não há problema em responder com respostas no formato unicode se houver uma página de código / conversor fazendo o backup.
dzaima 3/09/18
Tcsh, ok (embora no momento em que você esteja usando conversores arbitrários, me pareça que você também esteja escrevendo em um idioma com nomes completos e medindo o comprimento de uma instrução compilada de bytecode da VM).
Stuart P. Bentley
@ StuartP.Bentley Verifique o link Respostas do carvão vegetal - ele contém código legível por humanos! (então sim, 2 transpilations: p) Pessoas poderá fazê-resposta na montagem marcando o código de máquina, então não há nenhuma razão para resposta em VMs também
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()}

Experimente online!

  • -1 byte graças a Giuseppe
  • -10 bytes após a mudança de abordagem
  • -3 bytes explorando o código ASCII
  • -3 bytes graças a JayCe
digEmAll
fonte
Como não consegui encontrar nada a acrescentar, acabei de renomear variáveis ​​e também estou sugerindo outra via para retornar silenciosamente ... o que não estou completamente satisfeito com o TBH. Continuará procurando! TIO
JayCe 02/09
oh espera ... if(F)0é aceitável com certeza e economiza um byte. Ou ainda melhor rm()para 3 bytes.
JayCe 02/09
Minha sugestão de usar q()no meu primeiro comentário é inválida conforme esta meta
JayCe 2/18/18
@ JayCe: grande truque usando 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.

Experimente online!

AlexRacer
fonte
4

Python 2 , 256 248 240 228 199 195 bytes

Um programa mais longo, mas com abordagem um pouco diferente:

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

Experimente online!


economizou muitos bytes graças a ignorar o espaço em branco à direita e a incorporar alguns truques de @ovs
salvos ainda mais definindo uma variável anteriormente

micsthepick
fonte
Vou ter que corrigir isso amanhã (ele funciona, mas eu posso fazer melhor)
micsthepick
218 bytes .
Jonathan Frech
216 bytes
ovs 31/08/18
que era um subproduto de quando havia dois
micsthepick 01/09/18
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]}}

Experimente online!

Level River St
fonte
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¶

Experimente online! Nota: Alguns espaços em branco à direita na saída. Explicação:

\d+
$* 

Converta as entradas em espaços. (A segunda linha termina com um espaço.)

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

Crie os lados dos dois triângulos inferiores com o espaçamento apropriado.

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

Preencha a base dos triângulos.

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

Duplique os triângulos com o espaçamento vertical apropriado.

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

Converta os triângulos superiores em um único triângulo centralizado.

Neil
fonte
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)}

Experimente online!

-14 bytes de Rodolvertice

-1 byte corrigindo uma decrementação de variável de loop

riscado 404 é quase ainda 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
fonte
11
#define f para salvar alguns bytes
rodolphito
Você não pode fazer #define p putchar?
RK.
11
@RK. Se o fizesse, teria que usar em p(x);vez de p(x), para (+26, -6) = +20 bytes. O ponto-e-vírgula é incluído quando a macro é expandida.
Pizzapants184
284 bytes
ceilingcat
1

Geléia , 51 bytes

+‘⁶ẋ;Ɱ®Y
‘⁼þ`a”/o"”_o⁶Ṛ;ṚØ^yƊ$€©ż`j€Ḥ⁶ẋƊ}Y,@çj‘⁷ẋƊ}

Experimente online!

Erik, o Outgolfer
fonte