Hãy vẽ Triforce


29

Các Triforce là một vật hư cấu trong The Legend of Zelda , làm bằng ba tam giác đều giống hệt nhau, tìm đại diện cho sức mạnh, trí tuệ và lòng dũng cảm. Một số trò chơi trong saga bao gồm một hình ảnh động khi ba phần cuối cùng kết hợp với nhau.

Mục đích của thử thách này là vẽ một khung hình 2D duy nhất của một hình ảnh động đơn giản như vậy, với chiều rộng nhất định cho các hình tam giác và khoảng cách nhất định giữa các phần.

Đầu vào

Các đầu vào bao gồm hai số nguyên: chiều rộng và một giá trị khoảng cách s 0 .w1s0

Đầu ra

Khung phải được vẽ theo các thông số kỹ thuật sau:

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

Trong ví dụ trên, chúng ta có s = 2 .w=3s=2

Thêm ví dụ

, s = 0 :w=1s=0

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

w=2 , :s=0

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

w=3 , :s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Quy tắc

  • Không gian lưu trữ trên mỗi dòng là tùy chọn.
  • Không gian hàng đầu bổ sung trên mỗi dòng không được phép.
  • Bạn có thể xuất một dòng mới bổ sung hàng đầu và / hoặc một dòng mới duy nhất.
  • Đây là .

Câu trả lời:


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)

Hãy thử trực tuyến!


Đã lưu:

  • -3 byte, nhờ ông Xcoder

8

Than , 25 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

←×_N

Nhập wvà vẽ w _s.

↗⊕θ

Vẽ w+1 /s.

‖M

Phản ánh để hoàn thành tam giác đầu tiên.

≔⁺⊕θNη

Nhập svà tính toán bù giữa các tam giác trái và giữa.

Cη±η

Sao chép hình tam giác bên trái vào giữa.

‖BO⊗⊕θ

Phản xạ xung quanh tam giác giữa để hoàn thành triforce.


Uh, kiểm tra toán học của bạn về điều này. Đây có thể là 25 ký tự , nhưng đó là 50 đến 65 byte (tùy thuộc vào việc bạn sử dụng đại diện UTF-16 hay UTF-8 tương ứng).
Stuart P. Bentley

Lỗi của tôi; rõ ràng, Char than và Canvas có ánh xạ ký tự riêng , có vẻ hơi ngớ ngẩn đối với tôi (nếu bạn sẽ sử dụng các ký hiệu tùy ý, tại sao không sử dụng lựa chọn hiện có), nhưng bất cứ điều gì.
Stuart P. Bentley

@ StuartP.Bentley Điểm của trang web này là quy mô chương trình golf. Nhiều ngôn ngữ (có rất nhiều, nhiều hơn chỉ là Canvas & Than củi) đã chọn sử dụng tất cả 8 bit trên mỗi byte, vì đó là cách rất tốt để tiếp cận gần hơn với mức độ golf tối đa. Unicode đẹp chỉ để làm cho mã dễ đọc và viết hơn (bạn thử lập trình bằng C bằng cách viết mã byte; chúng ta cũng là con người)
dzaima


7

Canvas , 20 19 16 byte

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

Hãy thử nó ở đây!

Giải trình:

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

lưu ý: trong quá trình thực hiện điều này tôi đã sửa một lỗi trong mã, Nếu không sửa lỗi đó, đây sẽ là 18 byte .


Giống như câu trả lời của Neil , đây có thể là 16 ký tự , nhưng theo thuật ngữ Unicode, nó là 32 hoặc 44 byte, tùy thuộc vào UTF bạn sử dụng. (Tôi đã cân nhắc rằng nó có thể được biểu diễn trong một bộ ký tự một byte kế thừa như trang mã 437 , nhưng không có sẵn ω hoặc there ở đó, nên dường như tôi phải sử dụng định dạng chuyển đổi Unicode.)
Stuart P. Bentley

@ StuartP.Bentley Canvas sử dụng một bảng mã tùy chỉnh, như được liên kết trong tiêu đề của bài viết của tôi. Github wiki cho Char than cũng chứa codepage của nó. Họ đã đồng ý với PPCG rằng bạn có thể trả lời bằng các câu trả lời được định dạng unicode nếu có một bộ mã / bộ chuyển đổi sao lưu.
dzaima

Tcsh, được thôi (mặc dù tại thời điểm bạn đang sử dụng các trình chuyển đổi tùy ý, đối với tôi, có vẻ như bạn cũng có thể viết bằng một ngôn ngữ có tên đầy đủ và đo độ dài lệnh bằng mã VM được biên dịch).
Stuart P. Bentley

@ StuartP.Bentley Kiểm tra liên kết câu trả lời Char than - nó chứa mã có thể đọc được của con người! (vâng, 2 giao dịch: p) Mọi người ở đây trả lời về việc lắp ráp ghi điểm dưới dạng mã máy, vì vậy không có lý do gì để trả lời trong VM nữa
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()}

Hãy thử trực tuyến!

  • -1 byte nhờ Giuseppe
  • -10 byte sau khi thay đổi cách tiếp cận
  • -3 byte khám phá mã ASCII
  • -3 byte nhờ JayCe

Vì tôi không thể tìm thấy bất cứ điều gì để thêm vào điều này ... Tôi chỉ đổi tên các biến và tôi cũng đề nghị một con đường khác sẽ âm thầm trở lại ... điều mà tôi không hoàn toàn hài lòng với TBH. Sẽ tiếp tục tìm kiếm! TIO
JayCe

oh chờ đợi ... if(F)0có thể chấp nhận được và chắc chắn tiết kiệm một byte. Hoặc thậm chí tốt hơn rm()cho 3 byte.
JayCe

Đề xuất của tôi để sử dụng q()trong nhận xét đầu tiên của tôi là không hợp lệ theo meta này
JayCe

@JayCe: mẹo hay bằng cách sử dụng 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.

Hãy thử trực tuyến!


4

Python 2 , 256 248 240 228 199 195 byte

Một chương trình dài hơn, nhưng cách tiếp cận hơi khác nhau:

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

Hãy thử trực tuyến!


đã lưu rất nhiều byte nhờ bỏ qua khoảng trắng theo sau và kết hợp một số thủ thuật từ @ovs được
lưu nhiều hơn bằng cách xác định một biến trước đó


Tôi sẽ phải sửa lỗi này vào ngày mai (nó hoạt động, nhưng tôi có thể làm tốt hơn)
micsthepick




đó là một sản phẩm phụ từ khi có hai
micsthepick


2

Võng mạc 0.8.2 , 141 byte

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

Hãy thử trực tuyến! Lưu ý: Một số khoảng trắng ở đầu ra. Giải trình:

\d+
$* 

Chuyển đổi các đầu vào thành không gian. (Dòng thứ hai kết thúc bằng một khoảng trắng.)

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

Tạo các cạnh của hai hình tam giác dưới cùng với khoảng cách thích hợp.

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

Điền vào các hình tam giác.

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

Nhân đôi các hình tam giác với khoảng cách dọc thích hợp.

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

Chuyển đổi các tam giác trên thành một tam giác trung tâm duy nhất.


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

Hãy thử trực tuyến!

-14 byte từ Rodolvertice

-1 byte bằng cách sửa lỗi giảm biến vòng lặp

gạch bỏ 404 gần như vẫn là 404

Ung dung:

#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 để lưu một vài byte
Rodolphito

Bạn có thể không làm #define p putchar?
RK.

1
@RK. Nếu tôi đã làm, thì tôi sẽ phải sử dụng p(x);thay vì p(x), cho (+26, -6) = +20 byte. Dấu chấm phẩy được bao gồm khi macro được mở rộng.
pizzapants184


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.