Disegniamo il Triforce


29

Il Triforce è un artefatto immaginario in The Legend of Zelda , composto da tre triangoli equilateri dall'aspetto identico che rappresentano potere, saggezza e coraggio. Diversi giochi della saga includono un'animazione quando le tre parti finalmente si uniscono.

Lo scopo di questa sfida è di disegnare un singolo fotogramma 2D di un'animazione così semplificata, con una data larghezza per i triangoli e una data spaziatura tra le parti.

Ingresso

L'ingresso è composto da due numeri interi: una larghezza e un valore di spaziatura s 0 .w1s0

Produzione

Il telaio deve essere disegnato secondo le seguenti specifiche:

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

Nell'esempio sopra, abbiamo e s = 2 .w=3s=2

Più esempi

, s = 0 :w=1s=0

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

, s = 0 :w=2s=0

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

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4S=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Regole

  • Gli spazi finali su ogni riga sono opzionali.
  • Non sono ammessi spazi iniziali aggiuntivi su ogni riga.
  • È possibile produrre una nuova riga aggiuntiva in più e / o una singola riga finale in più.
  • Questo è .

Risposte:


10

Python 2 , 197 194 169 167 155 144 byte

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)

Provalo online!


Salvato:

  • -3 byte, grazie a Mr. Xcoder

8

Carbone , 25 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

←×_N

Inserisci we disegna w _s.

↗⊕θ

Disegna w+1 /s.

‖M

Rifletti per completare il primo triangolo.

≔⁺⊕θNη

Immettere se calcolare l'offset tra i triangoli sinistro e medio.

Cη±η

Copia il triangolo sinistro al centro.

‖BO⊗⊕θ

Rifletti attorno al triangolo centrale per completare la triforza.


Controlla la tua matematica su questo. Può contenere 25 caratteri , ma è compreso tra 50 e 65 byte (a seconda che si usi rispettivamente la rappresentazione UTF-16 o UTF-8).
Stuart P. Bentley,

Colpa mia; a quanto pare, Charcoal e Canvas hanno le loro mappature dei personaggi , il che mi sembra un po 'sciocco (se hai intenzione di usare simboli arbitrari, perché non usare una selezione esistente), ma qualunque cosa.
Stuart P. Bentley,

@ StuartP.Bentley Il punto di questo sito è la dimensione del programma di golf. Molte lingue (ce ne sono molte, molte altre oltre alla semplice tela e carbone) hanno optato per l'utilizzo di tutti gli 8 bit per byte, poiché è un ottimo modo per avvicinarsi al massimo golfismo. Il grazioso unicode è solo per rendere il codice più facile da leggere e scrivere (provi a programmare in C scrivendo bytecode; anche noi siamo umani)
dzaima,

8

Python 2 , 127 124 byte

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

Provalo online!


7

Tela , 20 19 16 byte

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

Provalo qui!

Spiegazione:

+├                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: nella realizzazione di questo ho corretto un errore nel codice, senza quella correzione, questo sarebbe di 18 byte .


Come la risposta di Neil , questo può contenere 16 caratteri , ma in termini Unicode è di 32 o 44 byte, a seconda dell'UTF che usi. (Ho considerato che potrebbe essere rappresentabile in un set di caratteri a byte singolo legacy come la tabella codici 437 , ma non ci sono ω o ⁸ disponibili lì, quindi mi sembra che dovresti scegliere un formato di trasformazione Unicode.)
Stuart P. Bentley,

@ StuartP.Bentley Canvas utilizza una tabella codici personalizzata, come indicato nel titolo del mio post. La wiki di Github per Charcoal contiene anche la sua tabella codici. È stato concordato su PPCG che è possibile rispondere con risposte in formato unicode se è presente una codepage / convertitore di backup.
dzaima,

Tcsh, okay (anche se nel momento in cui stai usando convertitori arbitrari, mi sembra che potresti anche scrivere in una lingua con nomi completi e misurare una lunghezza compilata dell'istruzione bytecode VM).
Stuart P. Bentley,

@ StuartP.Bentley Controlla il link Risposte carbone - contiene codice leggibile dall'uomo! (quindi sì, 2 transpilazioni: p) Le persone qui rispondono nel punteggio dell'assemblaggio come codice macchina, quindi non c'è motivo di rispondere anche nelle macchine virtuali
dzaima,

7

R , 225 , 224 , 214 , 211 , 208 byte

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

Provalo online!

  • -1 byte grazie a Giuseppe
  • -10 byte dopo il cambio di approccio
  • -3 byte che esplorano il codice ASCII
  • -3 byte grazie a JayCe

Dal momento che non riuscivo a trovare nulla da aggiungere a questo ... Ho appena rinominato le variabili e sto anche suggerendo un'altra strada per tornare in silenzio ... che non sono completamente soddisfatto di TBH. Continuerà a cercare! TIO
JayCe

oh aspetta ... if(F)0è sicuramente accettabile e salva un byte. O ancora meglio rm()per 3 byte.
JayCe

Il mio suggerimento da utilizzare q()nel mio primo commento non è valido secondo questo meta
JayCe

@JayCe: grande trucco usando rm ()!
digEmAll

4

Pascal (FPC) , 296 264 byte

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.

Provalo online!


4

Python 2 , 256 248 240 228 199 195 byte

Un programma più lungo, ma approccio leggermente diverso:

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

Provalo online!


salvato molti byte grazie all'ignorare lo spazio bianco finale e incorporando alcuni trucchi di @ovs
salvati ancora di più definendo una variabile in precedenza


Dovrò risolvere il problema domani (funziona, ma posso fare di meglio)
micsthepick




che era un sottoprodotto da quando c'era due
micsthepick


2

Retina 0.8.2 , 141 byte

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

Provalo online!Nota: alcuni spazi vuoti finali nell'output. Spiegazione:

\d+
$* 

Converti gli input in spazi. (La seconda riga termina con uno spazio.)

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

Crea i lati dei due triangoli inferiori con la spaziatura appropriata.

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

Riempi la base dei triangoli.

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

Duplica i triangoli con la spaziatura verticale appropriata.

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

Converti i triangoli superiori in un singolo triangolo centrato.


2

C (gcc), 404 389 byte

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

Provalo online!

-14 byte da Rodolvertice

-1 byte correggendo una decrementazione della variabile loop

barrato 404 è quasi ancora 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
}


1
#define f for salva alcuni byte
rodolphito

Non puoi fare #define p putchar?
RK.

1
@RK. Se lo facessi, dovrei usare p(x);invece di p(x), per (+26, -6) = +20 byte. Il punto e virgola viene incluso quando la macro viene espansa.
pizzapants184


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.