トライフォースを描きましょう


29

トライフォースは、の架空の人工物であるゼルダの伝説力、知恵と勇気を代表する3つの同一に見える正三角形で作られました、。サガのいくつかのゲームには、3つの部分が最終的に結合したときのアニメーションが含まれています。

この課題の目的は、三角形の幅とパーツ間の間隔を指定して、このような単純化されたアニメーションの2Dフレームを1つ描画することです。

入力

入力は、幅と間隔値の2つの整数で構成されます。w1s0

出力

フレームは、次の仕様に従って描画する必要があります。

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

上記の例では、とます。w=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

sを入力wして描画しw _ます。

↗⊕θ

描画しw+1 /ます。

‖M

反射して最初の三角形を完成させます。

≔⁺⊕θNη

s左の三角形と中央の三角形の間のオフセットを入力して計算します。

Cη±η

左の三角形を中央にコピーします。

‖BO⊗⊕θ

中央の三角形の周りを反射して、トライフォースを完成させます。


ええと、これであなたの数学を確認してください。これは25 文字ですが、50〜65 バイトです(それぞれUTF-16またはUTF-8表現を使用するかどうかによって異なります)。
スチュアートP.ベントレー

私の悪い; どうやら、CharcoalとCanvasには独自の文字マッピングがありますが、これは私にはちょっと馬鹿げているようです(任意のシンボルを使用する場合は、既存の選択を使用しないでください)。
スチュアートP.ベントレー

@ StuartP.Bentleyこのサイトのポイントは、ゴルフプログラムのサイズです。多くの言語(CanvasとCharcoalだけでなく、多くのものがあります)は、バイトあたり8ビットすべてを使用することを選択しました。これは、最大のゴルフ感に近づける非常に良い方法だからです。かわいいユニコードは、コードの読み取りと書き込みを簡単にするためのものです(バイトコードを書くことでCでプログラミングを試みます。私たちも人間です)
-dzaima


7

Canvas20 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個のかもしれ文字が、Unicodeの用語で、それはあなたが使用しているUTFに応じて、32または44バイトです。(コードページ437のような従来のシングルバイト文字セットで表現できると考えましたが、ωまたは⁸は利用できないため、Unicode変換フォーマットを使用する必要があるように思われます。)
Stuart P.ベントレー

@ StuartP.Bentley Canvasは、投稿のタイトルにリンクされているカスタムコードページを使用します。Charcoalのgithub wikiにもコードページが含まれています。それをバックアップするコードページ/コンバーターがあれば、ユニコード形式の回答で答えてもいいとPPCGで合意しています。
dzaima

Tcsh、大丈夫です(ただし、任意のコンバーターを使用している時点では、フルネームの言語で作成し、コンパイル済みのVMバイトコード命令の長さを測定しているようです)。
スチュアートP.ベントレー

@ StuartP.Bentley木炭の回答リンクを確認してください-人間が読めるコードが含まれています!(そう、2つの翻訳:p)ここの人々は、マシンコードとしてアセンブリスコアリングで回答するので、VMでも回答する理由はありません
-dzaima

7

R225224214211、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

q()最初のコメントで使用する私の提案は、このメタによって
です-JayCe

@JayCe:rm()を使用した素晴らしいトリック!
digEmAll


4

パイソン2256の 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




それは2つあったときの副産物でした
-micsthepick


2

Retina 0.8.2、141バイト

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

オンラインでお試しください!注:出力の末尾の空白。説明:

\d+
$* 

入力をスペースに変換します。(2行目はスペースで終わります。)

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

適切な間隔で下の2つの三角形の辺を作成します。

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で数バイト節約
ロドルフィト

できません#define p putcharか?
RK。

1
@RK。もしそうなら、(+ 26、-6)= +20バイトのp(x);代わりにp(x)、を使用する必要があります。マクロを展開すると、セミコロンが含まれます。
pizzapants184


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.