Mari kita menggambar Triforce

29

The Triforce adalah artefak fiksi dalam The Legend of Zelda , terbuat dari tiga segitiga sama sisi yang identik tampak mewakili kekuatan, kebijaksanaan dan keberanian. Beberapa permainan di saga menyertakan animasi ketika ketiga bagian akhirnya bergabung bersama.

Tujuan dari tantangan ini adalah untuk menggambar bingkai 2D tunggal dari animasi yang disederhanakan, dengan lebar yang diberikan untuk segitiga dan jarak yang diberikan antara bagian-bagian.

Memasukkan

Input terdiri dari dua bilangan bulat: lebar dan nilai spasi s 0 .w1s0

Keluaran

Bingkai harus ditarik sesuai dengan spesifikasi berikut:

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

Dalam contoh di atas, kita memiliki dan s = 2 .w=3s=2

Lebih banyak contoh

, s = 0 :w=1s=0

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

, s = 0 :w=2s=0

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

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

Aturan

  • Ruang tambahan pada setiap baris adalah opsional.
  • Ruang pemimpin tambahan di setiap baris tidak diperbolehkan.
  • Anda dapat mengeluarkan satu baris baru ekstra ekstra dan / atau baris tambahan ekstra tunggal.
  • Ini adalah .
Arnauld
sumber

Jawaban:

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)

Cobalah online!


Disimpan:

  • -3 byte, terima kasih kepada Tn. Xcoder
TFeld
sumber
8

Arang , 25 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

←×_N

Input wdan gambar w _s.

↗⊕θ

Draw w+1 /s.

‖M

Renungkan untuk melengkapi segitiga pertama.

≔⁺⊕θNη

Input sdan hitung offset antara segitiga kiri dan tengah.

Cη±η

Salin segitiga kiri ke tengah.

‖BO⊗⊕θ

Merefleksikan sekitar segitiga tengah untuk menyelesaikan triforce.

Neil
sumber
Uh, periksa matematika Anda tentang ini. Ini mungkin 25 karakter , tetapi 50 hingga 65 byte (tergantung apakah Anda menggunakan representasi UTF-16 atau UTF-8, masing-masing).
Stuart P. Bentley
Salahku; rupanya, Charcoal dan Canvas memiliki pemetaan karakter mereka sendiri , yang sepertinya sentuhan konyol bagi saya (jika Anda akan menggunakan simbol sewenang-wenang, mengapa tidak menggunakan pilihan yang ada), tetapi apa pun.
Stuart P. Bentley
@ StuartP.Bentley Maksud dari situs ini adalah untuk ukuran program golf. Banyak bahasa (ada banyak, lebih dari sekadar Canvas & Charcoal) memilih untuk menggunakan semua 8 bit per byte, karena itu adalah cara yang sangat baik untuk mencapai lebih dekat ke golfiness maksimum. Unicode yang cantik hanya untuk membuat kode lebih mudah dibaca dan ditulis (Anda mencoba pemrograman dalam C dengan menulis bytecode; kami juga manusia)
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))

Cobalah online!

ovs
sumber
7

Kanvas , 20 19 16 byte

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

Coba di sini!

Penjelasan:

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

catatan: dalam pembuatan ini saya memperbaiki kesalahan dalam kode, Tanpa perbaikan itu, ini akan menjadi 18 byte .

dzaima
sumber
Seperti jawaban Neil , ini mungkin 16 karakter , tetapi dalam istilah Unicode, itu adalah 32 atau 44 byte, tergantung pada UTF yang Anda gunakan. (Saya menganggap bahwa itu mungkin diwakili dalam set karakter byte tunggal warisan seperti kode halaman 437 , tetapi tidak ada ω atau ⁸ tersedia di sana, jadi menurut saya Anda harus pergi dengan format transformasi Unicode.)
Stuart P. Bentley
@ StuartP.Bentley Canvas menggunakan codepage khusus, sebagaimana ditautkan dalam judul posting saya. Wiki github untuk Charcoal juga berisi codepage-nya. Sudah disetujui di PPCG bahwa tidak apa-apa untuk menjawab dengan jawaban yang diformat unicode jika ada codepage / converter yang mendukungnya.
dzaima
Tcsh, oke (meskipun pada saat Anda menggunakan konverter yang berubah-ubah, menurut saya Anda mungkin juga menulis dalam bahasa dengan nama lengkap dan mengukur panjang instruksi bytecode VM yang dikompilasi).
Stuart P. Bentley
@ StuartP.Bentley Periksa tautan jawaban Arang - ini berisi kode yang dapat dibaca manusia! (jadi ya, 2 transpilasi: p) Orang-orang di sini menjawab dalam penilaian perakitan sebagai kode mesin, jadi tidak ada alasan untuk menjawab di VM juga
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()}

Cobalah online!

  • -1 byte terima kasih kepada Giuseppe
  • -10 byte setelah perubahan pendekatan
  • -3 byte meledak kode ASCII
  • -3 byte terima kasih kepada JayCe
menggali semua
sumber
Karena saya tidak dapat menemukan apa pun untuk ditambahkan ke ini ... Saya hanya mengganti nama variabel dan juga saya menyarankan jalan lain untuk kembali diam-diam ... yang saya tidak sepenuhnya puas dengan TBH. Akan terus mencari! TIO
JayCe
oh tunggu ... if(F)0bisa diterima pasti dan menyimpan satu byte. Atau bahkan lebih baik rm()untuk 3 byte.
JayCe
Saran saya untuk digunakan q()dalam komentar pertama saya tidak valid sesuai meta ini
JayCe
@JayCe: Trik hebat menggunakan 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.

Cobalah online!

AlexRacer
sumber
4

Python 2 , 256 248 240 228 199 195 byte

Program yang lebih panjang, tetapi pendekatan yang sedikit berbeda:

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

Cobalah online!


menghemat banyak byte berkat mengabaikan spasi tambahan, dan menggabungkan beberapa trik dari @ovs
bahkan lebih disimpan dengan mendefinisikan variabel sebelumnya

micsthepick
sumber
Saya harus memperbaiki ini besok (berfungsi, tapi saya bisa melakukan yang lebih baik)
micsthepick
218 byte .
Jonathan Frech
216 byte
ovs
itu adalah produk sampingan dari ketika ada dua
micsthepick
3

Ruby , 126 byte

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

Cobalah online!

Level River St
sumber
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¶

Cobalah online!Catatan: Beberapa spasi spasi tambahan dalam output. Penjelasan:

\d+
$* 

Ubah input menjadi spasi. (Baris kedua berakhir dengan spasi.)

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

Buat sisi-sisi dari dua segitiga bawah dengan jarak yang sesuai.

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

Isi dasar segitiga.

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

Gandakan segitiga dengan jarak vertikal yang sesuai.

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

Ubah segitiga atas menjadi segitiga terpusat tunggal.

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

Cobalah online!

-14 byte dari Rodolvertice

-1 byte dengan memperbaiki penurunan variabel loop

dicoret 404 hampir masih 404

Tidak Terkumpul:

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

pizzapants184
sumber
1
#define f untuk menyimpan beberapa byte
rodolphito
Tidak bisakah kamu melakukannya #define p putchar?
RK.
1
@RK. Jika saya melakukannya, maka saya harus menggunakan p(x);alih-alih p(x), untuk (+26, -6) = +20 byte. Titik koma disertakan saat makro diperluas.
pizzapants184
284 byte
ceilingcat
1

Jelly , 51 byte

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

Cobalah online!

Erik the Outgolfer
sumber