มาวาด Triforce กัน


29

The Triforceเป็นสิ่งประดิษฐ์สวมบทบาทในThe Legend of Zeldaทำจากสามเหลี่ยมสามด้านที่มีรูปลักษณ์เหมือนกันแสดงถึงพลังสติปัญญาและความกล้าหาญ หลายเกมในเทพนิยายรวมถึงภาพเคลื่อนไหวเมื่อสามส่วนเข้าด้วยกันในที่สุด

จุดประสงค์ของความท้าทายนี้คือการวาดเฟรม 2 มิติเดียวของภาพเคลื่อนไหวที่ทำให้ง่ายขึ้นโดยมีความกว้างที่กำหนดสำหรับรูปสามเหลี่ยมและระยะห่างที่กำหนดระหว่างส่วนต่างๆ

อินพุต

การป้อนข้อมูลประกอบด้วยสองจำนวนเต็ม: ความกว้างและค่าระยะห่างs 0W1s0

เอาท์พุต

เฟรมต้องถูกวาดตามข้อกำหนดต่อไปนี้:

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

ในตัวอย่างข้างต้นเรามีและs = 2W=3s=2

ตัวอย่างเพิ่มเติม

W=1 , :s=0

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

W=2 , :s=0

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

W=3 , :s=3

          /\          
         /  \         
        /    \        
       /______\       



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

W=4 , :s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

กฎระเบียบ

  • ช่องว่างต่อท้ายในแต่ละบรรทัดเป็นตัวเลือก
  • ไม่อนุญาตให้มีช่องว่างนำหน้าในแต่ละบรรทัด
  • คุณสามารถส่งออกบรรทัดใหม่ชั้นนำพิเศษหนึ่งบรรทัดและ / หรือบรรทัดใหม่ที่ต่อท้ายพิเศษหนึ่งบรรทัด
  • นี่คือรหัสกอล์ฟ

คำตอบ:



8

ถ่าน 25 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

←×_N

ป้อนwและวาดw _s

↗⊕θ

วาดw+1 /ของ

‖M

สะท้อนให้เห็นถึงความสมบูรณ์ของรูปสามเหลี่ยมแรก

≔⁺⊕θNη

ป้อนsและคำนวณค่าชดเชยระหว่างสามเหลี่ยมซ้ายและกลาง

Cη±η

คัดลอกสามเหลี่ยมซ้ายไปตรงกลาง

‖BO⊗⊕θ

ไตร่ตรองรอบสามเหลี่ยมกลาง


เอ่อตรวจสอบคณิตศาสตร์ของคุณในเรื่องนี้ นี่อาจเป็น 25 ตัวอักษรแต่จะ 50 ถึง 65 ไบต์ (ขึ้นอยู่กับว่าคุณใช้การแสดง UTF-16 หรือ UTF-8 ตามลำดับ)
Stuart P. Bentley

ความผิดฉันเอง; เห็นได้ชัดว่า Charcoal และ Canvas มีการแมปตัวละครของตัวเองซึ่งดูเหมือนจะโง่ไปหน่อยสำหรับฉัน (ถ้าคุณจะใช้สัญลักษณ์โดยพลการทำไมไม่ลองใช้ตัวเลือกที่มีอยู่)
Stuart P. Bentley

@ StuartP.Bentley จุดสำคัญของเว็บไซต์นี้คือขนาดของโปรแกรมกอล์ฟ หลายภาษา (มีมากมายมากกว่าผ้าใบและถ่าน) เลือกใช้ 8 บิตต่อไบต์เนื่องจากเป็นวิธีที่ดีมากในการเข้าถึงความใกล้ชิดสูงสุดของกอล์ฟ unicode ที่สวยงามนั้นใช้สำหรับการอ่านและเขียนโค้ดให้ง่ายขึ้น (คุณลองการเขียนโปรแกรมใน C โดยการเขียน bytecode เราก็เป็นคนเหมือนกัน)
dzaima


7

Canvas , 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 ไบต์


เช่นเดียวกับคำตอบของ Neilนี่อาจเป็นอักขระ 16 ตัวแต่ในเทอม Unicode มีขนาด 32 หรือ 44 ไบต์ขึ้นอยู่กับ UTF ที่คุณใช้ (ฉันคิดว่ามันอาจจะเป็นตัวแทนในชุดอักขระไบต์เดียวแบบดั้งเดิมเช่นรหัสหน้า 437แต่ไม่มีωหรือ⁸อยู่ที่นั่นดังนั้นฉันคิดว่าคุณต้องใช้รูปแบบการแปลง Unicode)
Stuart P. Bentley

@ StuartP.Bentley Canvas ใช้เพจรหัสที่กำหนดเองซึ่งเชื่อมโยงในชื่อโพสต์ของฉัน วิกิพีเดียสำหรับ Github สำหรับ Charcoal มีเพจรหัสด้วย เป็นที่ตกลงกันบน PPCG ว่ามันโอเคที่จะตอบด้วยคำตอบที่จัดรูปแบบ Unicode ถ้ามีเพจรหัส / ตัวแปลงข้อมูลสำรอง
dzaima

Tcsh ไม่เป็นไร (ถึงจุดที่คุณใช้ตัวแปลงตามอำเภอใจดูเหมือนว่าฉันอาจจะเขียนเป็นภาษาที่มีชื่อเต็มและวัดความยาวคำสั่ง VM bytecode ที่คอมไพล์แล้ว)
Stuart P. Bentley

@ StuartP.Bentley ตรวจสอบลิงค์คำตอบ Charcoal - มันมีรหัสที่มนุษย์อ่านได้! (ใช่แล้ว 2 transpilations: p) ผู้คนที่นี่ตอบคำถามในการให้คะแนนแอสเซมบลีเป็นรหัสเครื่องดังนั้นจึงไม่มีเหตุผลที่จะตอบใน VMs ด้วย
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()}

ลองออนไลน์!

  • -1 ไบต์ขอบคุณ Giuseppe
  • -10 ไบต์หลังจากเปลี่ยนวิธีการ
  • -3 ไบต์กำลังเปิดเผยรหัส ASCII
  • -3 ไบต์ขอบคุณ JayCe

เนื่องจากฉันไม่พบสิ่งใดที่จะเพิ่มในสิ่งนี้ ... ฉันเพิ่งเปลี่ยนชื่อตัวแปรและฉันขอแนะนำอีกหนทางหนึ่งให้กลับมาเงียบ ๆ ... ซึ่งฉันไม่พอใจอย่างสมบูรณ์กับ TBH จะทำการค้นหาต่อไป! TIO
JayCe

โอ้เดี๋ยวก่อน ... if(F)0เป็นที่ยอมรับอย่างแน่นอนและช่วยประหยัดหนึ่งไบต์ หรือดียิ่งขึ้นrm()สำหรับ 3 ไบต์
JayCe

ข้อเสนอแนะของฉันที่จะใช้q()ในความคิดเห็นแรกของฉันไม่ถูกต้องตามmeta นี้
JayCe

@ JayCe: เคล็ดลับที่ยอดเยี่ยมในการใช้ rm ()!
digEmAll


4

Python 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

218 ไบต์
Jonathan Frech



นั่นเป็นผลพลอยได้จากเมื่อมีสอง
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)}

ลองออนไลน์!

-14 ไบต์จากRodolvertice

-1 ไบต์โดยการแก้ไขการลดตัวแปรลูป

ขีดฆ่า404ยังคงเป็น 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 สำหรับบันทึกสองสามไบต์
rodolphito

คุณทำไม่ได้#define p putcharเหรอ
RK

1
@RK ถ้าฉันทำแล้วฉันจะต้องใช้p(x);แทนp(x)(+26, -6) = +20 ไบต์ อัฒภาคจะถูกรวมไว้เมื่อขยายแมโคร
pizzapants184


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.