Triforce를 그리자


29

트리 포스는 에서 가상의 유물이다 젤다의 전설 힘, 지혜와 용기를 대표하는 세 동일한 찾고 등변 삼각형으로 만들어진. saga의 여러 게임에는 세 부분이 마침내 합쳐질 때 애니메이션이 포함됩니다.

이 도전의 목적은 삼각형에 대해 주어진 너비와 부품 사이에 주어진 간격을 가진 간단한 애니메이션의 단일 2D 프레임을 그리는 것입니다.

입력

입력 값은 폭 및 간격 값 s 0 의 두 정수로 구성됩니다 .w1s0

산출

다음 사양에 따라 프레임을 그려야합니다.

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

위의 예에서 s = 2 입니다.w=3s=2

더 많은 예

, s = 0 :w=1s=0

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

, s = 0 :w=2s=0

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

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

규칙

  • 각 줄의 후행 공백은 선택 사항입니다.
  • 각 줄에 추가 선행 공백이 허용되지 않습니다.
  • 하나의 추가 선행 개행 및 / 또는 하나의 추가 추가 개행을 출력 할 수 있습니다.
  • 이것은 입니다.

답변:



8

, 25 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

←×_N

s를 입력 w하고 그립니다 w _.

↗⊕θ

그리 w+1 /들.

‖M

첫 번째 삼각형을 완성하십시오.

≔⁺⊕θNη

s왼쪽과 중간 삼각형 사이의 오프셋을 입력 하고 계산하십시오.

Cη±η

왼쪽 삼각형을 가운데로 복사하십시오.

‖BO⊗⊕θ

삼각형을 중심으로 삼중 항을 완성하십시오.


어, 이것에 대한 수학을 확인하십시오. 이것은 25 자일 수 있지만 , 각각 UTF-16 또는 UTF-8 표현을 사용하는지에 따라 50-65 바이트 입니다.
스튜어트 P. 벤틀리

내 잘못이야; 분명히 Charcoal과 Canvas에는 고유 한 문자 매핑 이 있습니다.
스튜어트 P. 벤틀리

@ StuartP.Bentley이 사이트의 요점은 골프 프로그램 크기입니다. 많은 언어 (Canvas & Charcoal보다 많은 언어가 많음)는 바이트 당 8 비트를 모두 사용하도록 선택했습니다. 이는 최대 골프에 가까워 질 수있는 매우 좋은 방법이기 때문입니다. 예쁜 유니 코드는 코드를보다 쉽게 ​​읽고 쓸 수 있도록하기위한 것입니다 (바이트 코드를 작성하여 C로 프로그래밍을 시도해보십시오. 우리도 인간입니다)
dzaima


7

캔버스 , 20 19 16 바이트

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

여기 사용해보십시오!

설명:

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

참고 :이 작업을 수행 할 때 코드에서 실수를 수정했습니다.이 수정 사항이 없으면 18 바이트 입니다.


마찬가지로 닐의 대답 이 16이 개 될 수 있습니다 문자 ,하지만 유니 코드 측면에서, 당신이 사용하는 UTF에 따라 중 32 또는 44 바이트입니다. ( 코드 페이지 437 과 같은 레거시 단일 바이트 문자 세트로 표현할 수 있다고 생각 했지만 거기에 사용 가능한 ω 또는 ⁸가 없으므로 유니 코드 변환 형식을 사용해야 할 것 같습니다.)
Stuart P. 벤틀리

@ StuartP.Bentley Canvas는 내 게시물 제목에 링크 된대로 사용자 정의 코드 페이지를 사용합니다. 차콜 용 github 위키에는 코드 페이지도 포함되어 있습니다. PPCG에서 백업하는 코드 페이지 / 컨버터가 있으면 유니 코드 형식의 응답으로 응답해도된다는 데 동의합니다.
dzaima

Tcsh, 좋습니다 (임의의 변환기를 사용하는 시점에서 전체 이름을 가진 언어로 작성하고 컴파일 된 VM 바이트 코드 명령 길이를 측정하는 것으로 보입니다).
스튜어트 P. 벤틀리

@ StuartP.Bentley Charcoal 답변 링크 확인-사람이 읽을 수있는 코드가 포함되어 있습니다! (그렇습니다, 2 개의 번역 : : p) 여기 사람들은 기계 점수로 어셈블리 스코어링에 답하므로 VM에서도 대답 할 이유가 없습니다.
dzaima

7

R , 225 , 224 , 214 , 211 , 208 바이트

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

온라인으로 사용해보십시오!

  • 주세페 덕분에 -1 바이트
  • 접근 방식 변경 후 -10 바이트
  • ASCII 코드를 탐색하는 -3 바이트
  • JayCe 덕분에 -3 바이트

추가 할 항목을 찾을 수 없었기 때문에 변수 이름을 변경했으며 TBH에 완전히 만족하지 않는 다른 길을 조용히 반환 할 것을 제안하고 있습니다. 계속 검색하십시오! TIO
JayCe

아 잠깐만 ... if(F)0허용되며 1 바이트를 저장합니다. 또는 rm()3 바이트가 더 좋습니다 .
JayCe September

q()첫 번째 의견 에 사용할 제안 은 이 메타에
JayCe

@JayCe : rm ()을 사용하는 훌륭한 트릭!
digEmAll

4

파스칼 (FPC) , 296264 바이트

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.

온라인으로 사용해보십시오!


4

파이썬 2 , 256 248 240 228 199 195 바이트

더 긴 프로그램이지만 약간 다른 접근법 :

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

온라인으로 사용해보십시오!


후행 공백을 무시하고
많은 변수 를 미리 저장 하여 @ovs의 일부 트릭을 통합하여 많은 바이트를 절약했습니다.


내일이 문제를 해결해야합니다 (작동하지만 더 잘할 수 있습니다)
micsthepick




이있을 때의 부산물이었다 그
micsthepick


2

레티 나 0.8.2 , 141 바이트

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

온라인으로 사용해보십시오! 참고 : 일부 출력 공백. 설명:

\d+
$* 

입력을 공백으로 변환하십시오. (두 번째 줄은 공백으로 끝납니다.)

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

적절한 간격으로 아래쪽 두 삼각형의 변을 만듭니다.

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

삼각형의 밑면을 채우십시오.

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

적절한 수직 간격으로 삼각형을 복제하십시오.

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

상단 삼각형을 단일 중심 삼각형으로 변환합니다.


2

C (gcc), 404 389 바이트

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

온라인으로 사용해보십시오!

Rodolvertice 에서 -14 바이트

루프 변수 감소를 수정하여 -1 바이트

404를 넘어 거의 404

언 골프 드 :

#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는 몇 바이트를 절약합니다
rodolphito

당신은 할 수 없습니까 #define p putchar?
RK.

1
@RK. 내가 그렇다면 (+26, -6) = +20 바이트에 대해 p(x);대신 을 사용해야 p(x)합니다. 매크로가 확장되면 세미콜론이 포함됩니다.
pizzapants184 년


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.