Narysujmy Triforce

29

Triforce to fikcyjna artefakt w The Legend of Zelda , złożony z trzech identycznych trójkątów równobocznych prognozujących reprezentujących moc, mądrość i odwagę. Kilka gier w tej sadze zawiera animację, kiedy trzy części w końcu się łączą.

Celem tego wyzwania jest narysowanie pojedynczej klatki 2D o tak uproszczonej animacji, o danej szerokości dla trójkątów i zadanym odstępie między częściami.

Wkład

Dane wejściowe składają się z dwóch liczb całkowitych: szerokości i wartości odstępu s 0 .w1s0

Wydajność

Rama musi zostać narysowana zgodnie z następującymi specyfikacjami:

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

W powyższym przykładzie, mają , a y = 2 .w=3s=2

Więcej przykładów

, s = 0 :w=1s=0

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

, s = 0 :w=2s=0

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

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Zasady

  • Końcowe spacje w każdej linii są opcjonalne.
  • Dodatkowe spacje wiodące w każdej linii są niedozwolone.
  • Możesz wygenerować jedną dodatkową nową linię i / lub jedną dodatkową nową linię.
  • To jest .
Arnauld
źródło

Odpowiedzi:

10

Python 2 , 197 194 169 167 155 144 bajtów

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)

Wypróbuj online!


Zapisano:

  • -3 bajty, dzięki Mr. Xcoder
TFeld
źródło
8

Węgiel , 25 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

←×_N

Wprowadź wi narysuj w _s.

↗⊕θ

Draw w+1 /s.

‖M

Zastanów się, aby ukończyć pierwszy trójkąt.

≔⁺⊕θNη

Wprowadź si oblicz przesunięcie między lewym i środkowym trójkątem.

Cη±η

Skopiuj lewy trójkąt na środek.

‖BO⊗⊕θ

Zastanów się wokół środkowego trójkąta, aby ukończyć triforce.

Neil
źródło
Sprawdź swoją matematykę. Może to być 25 znaków , ale od 50 do 65 bajtów (w zależności od tego, czy używasz odpowiednio reprezentacji UTF-16 czy UTF-8).
Stuart P. Bentley,
Mój błąd; najwyraźniej węgiel drzewny i płótno mają własne odwzorowanie postaci , co wydaje mi się niemądre w dotyku (jeśli zamierzasz używać dowolnych symboli, dlaczego nie użyć istniejącej selekcji), ale cokolwiek.
Stuart P. Bentley,
@ StuartP.Bentley Celem tej strony jest rozmiar programu golfowego. Wiele języków (jest wiele, wiele więcej niż tylko płótno i węgiel) wybrało wykorzystanie wszystkich 8 bitów na bajt, ponieważ jest to bardzo dobry sposób na zbliżenie się do maksymalnej golfisty. Ładna Unicode służy tylko do ułatwienia odczytu i zapisu kodu (próbujesz programować w C, pisząc kod bajtowy; my też jesteśmy ludźmi)
dzaima
8

Python 2 , 127 124 bajtów

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

Wypróbuj online!

ovs
źródło
7

Płótno , 20 19 16 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

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

uwaga: w wyniku tego naprawiłem błąd w kodzie, bez tej poprawki byłoby to 18 bajtów .

dzaima
źródło
Podobnie jak odpowiedź Neila , może to być 16 znaków , ale w ujęciu Unicode jest to 32 lub 44 bajty, w zależności od używanego UTF. (Pomyślałem, że może być reprezentowalny w starszym jednobajtowym zestawie znaków, takim jak strona kodowa 437 , ale nie ma tam ani ω, ani,, więc wydaje mi się, że będziesz musiał użyć formatu transformacji Unicode.)
Stuart P. Bentley,
@ StuartP. Bentley Canvas używa niestandardowej strony kodowej, do której link znajduje się w tytule mojego postu. Wiki github dla Charcoal również zawiera stronę kodową. Na PPCG uzgodniono, że można odpowiadać odpowiedziami w formacie Unicode, jeśli jest to strona kodowa / konwerter.
dzaima
Tcsh, dobrze (chociaż w momencie, gdy używasz dowolnych konwerterów, wydaje mi się, że równie dobrze możesz pisać w języku z pełnymi nazwami i mierzyć długość skompilowanej instrukcji bajtecode VM).
Stuart P. Bentley,
@ StuartP.Bentley Sprawdź link z odpowiedziami na węgiel drzewny - zawiera kod czytelny dla człowieka! (więc tak, 2 transpilacje: p) Ludzie tutaj odpowiadają w punktacji zestawu jako kod maszynowy, więc nie ma powodu, aby odpowiadać również w maszynach wirtualnych
dzaima
7

R , 225 , 224 , 214 , 211 , 208 bajtów

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

Wypróbuj online!

  • -1 bajt dzięki Giuseppe
  • -10 bajtów po zmianie podejścia
  • -3 bajty eksplodujące kod ASCII
  • -3 bajty dzięki JayCe
digEmAll
źródło
Ponieważ nie mogłem znaleźć niczego, co można by do tego dodać ... Po prostu zmieniłem nazwy zmiennych, a także sugeruję inną drogę, by powrócić cicho ... czego nie jestem w pełni zadowolony z TBH. Będzie szukał dalej! TIO
JayCe
och czekaj ... if(F)0jest na pewno do przyjęcia i oszczędza jeden bajt. Lub jeszcze lepiej rm()dla 3 bajtów.
JayCe,
Moja propozycja użycia q()w moim pierwszym komentarzu jest nieprawidłowa, zgodnie z tym meta
JayCe,
@JayCe: świetna sztuczka przy użyciu rm ()!
digEmAll
4

Pascal (FPC) , 296 264 bajtów

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.

Wypróbuj online!

AlexRacer
źródło
4

Python 2 , 256 248 240 228 199 195 bajtów

Dłuższy program, ale nieco inne podejście:

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

Wypróbuj online!


zaoszczędził wiele bajtów dzięki ignorowaniu końcowej spacji i włączeniu niektórych sztuczek z @ovs
zapisanych jeszcze bardziej poprzez wcześniejsze zdefiniowanie zmiennej

Micsthepick
źródło
Będę musiał to naprawić jutro (działa, ale mogę to zrobić lepiej)
micsthepick
218 bajtów .
Jonathan Frech
był to produkt uboczny z
czasów,
3

Rubin , 126 bajtów

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

Wypróbuj online!

Level River St
źródło
2

Retina 0.8.2 , 141 bajtów

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

Wypróbuj online! Uwaga: Niektóre końcowe białe znaki wyjściowe. Wyjaśnienie:

\d+
$* 

Przekształć dane wejściowe w spacje. (Druga linia kończy się spacją.)

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

Utwórz boki dwóch dolnych trójkątów z odpowiednim odstępem.

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

Wypełnij podstawę trójkątów.

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

Powiel trójkąty z odpowiednimi odstępami pionowymi.

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

Przekształć górne trójkąty w pojedynczy trójkąt wyśrodkowany.

Neil
źródło
2

C (gcc), 404 389 bajtów

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

Wypróbuj online!

-14 bajtów z Rodolvertice

-1 bajt poprzez ustalenie dekrementacji zmiennej pętli

przekreślony 404 to prawie wciąż 404

Nie golfowany:

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

pizzapanty184
źródło
1
#
zdefiniować
Nie można zrobić #define p putchar?
RK.
1
@RK. Gdybym to zrobił, musiałbym użyć p(x);zamiast p(x), ponieważ (+26, -6) = +20 bajtów. Średnik jest uwzględniany przy rozwinięciu makra.
pizzapants184
284 bajty
ceilingcat
1

Galareta , 51 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło