非常にシンプルな三角形


47

正の整数を(stdin、コマンドライン、または関数argを介して)取り込むプログラムまたは関数を作成し、これらの多数の小さな三角形の文字列を並べて表示または返します。

 /\
/__\

入力がの場合、この唯一の三角形が出力になります1

入力がの2場合、出力は

  ____
 /\  /
/__\/

入力がの3場合、出力は

  ____
 /\  /\
/__\/__\

入力がの4場合、出力は

  ________
 /\  /\  /
/__\/__\/

等々。あなたのプログラムは、2までの入力に対応している必要があり16 1 = 65535 - 。

詳細

  • 左端の三角形は常に上向きです。
  • 後続のスペースが存在する場合がありますが、不必要な先行スペースがない場合があります。
  • オプションの末尾の改行がある場合があります。
  • 以下のためにことに注意してください1出力二行の長さであるが、それ以外の場合は3です。これは必須です。
  • バイト単位の最短提出勝ちです。

回答:


32

Pyth、44 42

ItQpdd*\_*4/Q2)jbms<*dQhQ,c" /\ "2,\/"__\\

最初の行:

ItQpdd*\_*4/Q2)
ItQ           )    If the input is not 1
   pdd             Print two spaces
      *\_*4/Q2     Then groups of 4 underscores, repeated input/2 times.

他の2行は、2行目がinput + 1回で構成され" /""\ "交互に入力され、3行目が同じ形式で構成され"/""__\"交互になっていることに注意して生成されます。


158
ストライクアウト44はまだ通常44 :(
オプティマイザー

4
42もちろん!
mbomb007

48
@Optimizer:44の外観に対するあなたの悲しみは、質問またはこの回答よりも多くの票を獲得したことを、無限に面白いと思います。
アレックスA.

6
レオ

3
@AlexA。44の外観に対するオプティマイザーの悲しみに対するあなたの楽しみが、質問またはこの回答よりも多くの票を獲得したことは、無限に面白いと思います。
isaacg

24

SQL、182の 175 173 187バイト

これが最短になるというわけではありませんが、SQLを最小化するのは面白いことです。[編集]指摘したように、when input = 1ルールを適用しませんでした-2行のみ表示します。より良い方法を考えることはできませんが、vロジックを変更して数バイトを節約しました;)事前に2を追加すると、後で繰り返す必要がないため、数バイトを節約できます[/ edit]

select decode(&i,1,'',rpad('  ',v,'____')||z)||rpad(' /',v,'\  /')||decode(y,1,'\')||z||rpad('/',v-1,'__\/')||decode(y,1,'__\')from(select 2+floor(&i/2)*4v,mod(&i,2)y,chr(10)z from dual);

[edit1]不要なスペースを削除しました[/ edit1] [edit2] && iを&iに変更しました。これは2文字を削減しますが、ユーザーは三角形の数を2回入力するように強制します...:PIは&& iを使用して私の「良いコーディング習慣」が2バイトになることを認識しました!! ホラー!![/ edit2]

説明 (注:この説明では&& 1を使用しているため、プロンプトは1回だけで、上記の&1はコードスペースを節約しますが、複数回プロンプトを表示します;))

 select  -- line 1
     decode(&&1,1,'',   -- don't need line 1 if input is 1
     rpad('  ',v,'____') || z ) || -- every pair of triangles
     -- line 2
     rpad(' /',v,'\  /') ||  -- every pair of triangles
          decode(y,1,'\') || z || -- add the final triangle, input: 1,3,5 etc.
     -- line 3
     rpad('/',v-1,'__\/') ||  -- every pair of triangles
          decode(y,1,'__\')   -- add the final triangle, input: 1,3,5 etc.
from (select 2+floor(&&i/2)*4 v,   -- common multiplier. 4 extra chars for every triangle pair
             mod(&&i,2) y,  -- Flag for the final triangle (odd inputs, 1,3,5, etc)
             chr(10) z  -- CR, here to save space.
        from dual);

出力

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

    ________________________
   /\  /\  /\  /\  /\  /\  /
  /__\/__\/__\/__\/__\/__\/


  SQL>

1
後にスペースを削除することはできfromますか?もしそうなら、それはあなたにバイトを節約します。
アレックスA.

ああ主君..それはナッツです。それを試してみた..そして「町に行って」私ができるスペースを取り除いた... Ooこの吸盤は今読めない..しかしそれはまだ動作する;)lol(私はエイリアスがまだそのように働くと信じることができない.. )
同上

賛成票で混乱しています!Oo最小サイズに近いところはありません。うわー。
同上

2
通常、投票は、クリエイティブである、使用されている言語が一般的でない、またはさまざまな理由があるため、人々があなたの投稿を好むことを示します。私の経験では、最短のゴルフの答えが最高得点になることはめったにありません。したがって、これは最短の回答ではないかもしれませんが、コミュニティはそれを良い回答とみなしました。:)
アレックスA.

@アレックス..クール、グレービー:)(私は次にExcelでこれを試してみる必要があります...笑)
同上

11

Python 2、89 88 87 85 83名前付き/ 81名前なし

f=lambda n:1%n*("  "+n/2*4*"_"+"\n")+(" /\ "*n)[:2+2*n]+"\n"+("/__\\"*n)[:n-~n+n%2]

(1バイトの@orlp、さらに3つの@xnorに感謝します)

これはintを取り、n行ごとのアプローチを使用して三角形を文字列として返す関数です。

例えばprint f(10)与える

  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

最初の行のため、代わりに(n>1)*我々が使用し1%n*、以降の1%n0の場合でn == 1あれば1 n > 1


1
あなたは回し、文字をオフに剃ることができます" /\\ "" /\ "
orlp

このラムダはPython 3でも機能しませんか?
mbomb007

2
@ mbomb007そこにフロア部門があります
-Sp3000

@orlp混乱を追加しますが、コメントを削除します;)
FryAmTheEggman

"\n".join()リストが条件付きで最初の要素を削除するために使用されている場合でも、3つの項目については疑っています。おそらくb*(x+"\n")+y+"\n"+zもっと短いものはありますか?
xnor

7

JavaScript(ES6)、101 109

長すぎる

f=(n,z=a=>a.repeat(n/2))=>(n>1?'  '+z('____')+'\n ':' ')+z('/\\  ',w=' /'[++n&1]+'\n')+w+z('/__\\')+w

説明

関数定義に太い矢印を使用します。さらに、{}ブロックなし:関数本体は戻り値である単一の式です。f=(a,b,c)=>exprに等しい

function f(a,b,c)
{
  return expr;
}

単一の式内では、ifor varなどのステートメントを使用できませんが、

  • デフォルト値を持つパラメーターはローカル変数として使用できます
  • 条件式?:if else
  • コンマ演算子を使用して、または関数の未使用のパラメーターとしてさらに良い部分式を追加できます。この場合、の割り当てはw関数の2番目の(未使用の)パラメーターですz

f関数を次のように書き換えることができます

f = function(n) {
  var z = function(a) { // use current value of n (that changes)
    return a.repeat(n/2);
  };
  var result;
  if (n > 1) {
    result = '  ' + z('____') + '\n '; // top row if more than 1 triangle
  else
    result = ' '; // else just the blank
  ++n; // increase n, so invert even/odd
  w = ' /'[n&1]+'\n'; //  blank if n is now even, else '/' if n is now odd
  // the next rows will end in "/\" or "\  /" based on n even/odd
  result +=  z('/\\  ') + w; // offset by the blank char added before
  result += z('/__\\') + w;
  return result;
}

Firefox / FireBugコンソールでテストする

console.log(f(1),f(2),f(3),f(4),f(9))

出力

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

  ________
 /\  /\  /
/__\/__\/

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 

うまくできました!昨日はあまりにも長い時間を費やして短くして、どうにかして109をさまざまな方法で再現しました。-8はかなりのジャンプです。
DocMax

クール。説明を投稿できますか?私の使用を完全に理解していないw
-BadHorsie

@BadHorseの説明を追加(本当に、今回)
edc65

おもしろくないので、私は末尾のスペースなしでそれをやろうとしましたがn=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)、119に思いつきました(あなたの答えに合わせてテンプレート文字列などを意図的に使用しませんでした)。
ニール


6

ハスケル155 153 139 131のバイト

元の方法よりも短いことが判明したわずかに異なるアプローチを見つけました。私の最初の試みは以下に保存されています。前と同様に、ゴルフのヒントは高く評価されています。

m n=unlines.dropWhile(=="  ").z["  "," /","/"].foldr1 z$map t[1..n]
t n|odd n=["","\\","__\\"]
t _=["____","  /","/"]
z=zipWith(++)

ゴルフのヒントをくれたニミに感謝します。


前の試行197 179バイト

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith

4
ゴルフのためのいくつかのヒント:(mod n 2)==0あるeven n以上使用odd nし、スワップthenおよびelse一部。concat.take(div n 2).repeatあるtake(4*div n 2).cycleすべてのリストの要素は、長さの長い名前、例えば持つ関数へ4.割り当ての短い名前であるのでz=zipWith、次に使います- z。いくつかのスペースをキックアウトできます...repeat""else[...
nimi

@nimiヒントをありがとう!それらを使用して、私は元のソリューションを179バイトまでゴルフすることができました。アプローチを再考することで、ソリューションを155バイトに削減することもできました。
アンク-morpork

1
ヒント、パートII:foldr z["","",""]foldr1 z、折りたたむリストが空にならないためです。代わりに(<-間に2つのスペース)all(==' ') を使用できます。==" "これは、n = 1の場合に空行を削除するために使用され、最初の行はであるため" "です。の最初の定義はt、1行で記述できますt n|odd...
nimi

4

CJam、73 68 63 62 60バイト

これには間違いなくいくつかのゴルフが必要です...

S2*l~:I2/'_4**N]I(g*S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

ここでテストしてください。

説明

"Print the first line:";
S2*l~:I2/'_4**N]I(g*

S2*                  "Push a string with 2 spaces.";
   l~:I              "Read and eval the input, store it in I.";
       2/            "Divide by two to get the number of top segments.";
         '_4**       "Push '____' and repeat it by the number of segments.";
              N]     "Push a newline and wrap everything in an array.";
                I(g* "Get sign(I-1) and repeat the array that often. This is a no-op
                      for I > 1 but otherwise empties the array.";

"Print the other two lines. The basic idea is to define block which takes as arguments
 a repeatable 4-character string as well as another string which only gets printed for
 even I.";
S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

S                                        "Push a space.";
 "\\__/"'\                               "Push the string '\__/' and the character \.";
          {             }:F~             "Store this block in F and evaluate it.";
           I2md                          "Get I/2 and I%2 using divmod.";
               @*                        "Pull up the second argument and repeat it I%2
                                          times. This turns it into an empty string for
                                          even I.";
                 @@                      "Pull up I/2 and the 4-character string.";
                   *                     "Repeat the string I/2 times.";
                    '/\@                 "Push a / and reorder the three line parts.";
                            N            "Push a newline.";
                             "__\\/"_W<F "Call F again, with '__\/' and '__\'.";

4

ジュリア、115バイト

n->(m=2;p=println;k=n%2>0?m+1:m;e=m<k?"":"/";t=" /\\ ";b="/__\\";if n>1 p("  "*"_"^4m)end;p(t^k*" "*e);p(b^k*e))

これにより、整数を受け入れて三角形を出力する名前のない関数が作成されます。呼び出すには、名前を付けf=n->(...)ます。

Ungolfed +説明:

function f(n)

    m = n ÷ 2                    # Number of upside down triangles
    p = println                  # Store println function to save space
    k = n % 2 > 0 ? m + 1 : m    # Number of right side up triangles
    e = m < k ? "" : "/"         # n even? End lines with a /

    # Top of the triangle
    t = " /\\ "

    # Bottom of the triangle
    b = "/__\\"

    # Print the bottoms of any upside down triangles
    # * performs string concatenation
    # ^ performs string repetition
    if n > 1
        println("  " * "_"^4m)
    end

    # Print the triangle tops (these have two trailing spaces
    # if the last triangle isn't upside down)
    println(t^k * " " * e)

    # Print the triangle bottoms
    println(b^k * e)
end

出力例:

julia> for i = 1:10 f(i) end
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

私はこれがとても長いことをかなり恥ずかしく思います。ゴルフの機会はたくさんあると思いますが、現時点では明確ではありません。提案がある場合、またはさらに説明が必要な場合はお知らせください!



3

C#190

void f(int n){string s=(n>1)?"\n  ":"",t=" /",u = "/";bool b=true;int m=n;while(m-->0){s+=(n>1&&b&&m>0)?"____":"";t+=b?"\\":"  /";u+=b?"__\\":"/";b=!b;}Console.Write("{0}\n{1}\n{2}",s,t,u);}

非ゴルフ

void f(int n)
{
string s = (n > 1) ? "\n  " : "", t = " /", u = "/";
bool b = true;
int m = n;
while(m-->0)
{
s += (n > 1 && b && m>0) ? "____" : "";
t += b ? "\\" : "  /";
u += b ? "__\\" : "/";
b = !b;
}
Console.Write("{0}\n{1}\n{2}",s,t,u);
}

1
よくやった!whileループを使用する方が、決してループを使用するよりも優れていることに注意してforください。この場合m、forループの初期化に定義を含めることで2バイトを節約できますb=!b。また、交換することによりコスト削減を行うことができますstringし、boolvar。また、「()」の周りには必要ありませんn>1条項、およびにs+=句あなたは非短絡を使用することができます&ではなく、&&何の副作用や逆参照が存在しないとして間違って行くこと。最後に、;)1>0より短いtrue
-VisualMelon

3

C#、257183バイト

void C(int t){int i;var n="\r\n";var s="  "+string.Join("____",new string[1+t/2])+n;for(i=0;i++<=t;)s+=i%2<1?"\\ ":" /";s+=n;for(i=0;i++<=t;)s+=i%2<1?"__\\":"/";Console.WriteLine(s);}

編集: @VisualMelonのヒントのおかげで、74バイト節約されました。

ゴルフに最適な言語とはほど遠いことはわかっていますが、競争に勝つことよりも、C#のさまざまなニュアンスについて学ぶことに主に興味があります。これは基本的に、この Pythの回答の移植版です。

私はforループをさらにゴルフにかけることができると考えていますが、その中に埋め込まれた3番目のステートメントを考えると、どのようにすればよいかよくわかりません。

例(1、2、3、10):

 /\   
/__\  
  ____
 /\  /
/__\/
  ____
 /\  /\ 
/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

ゴルフをしていない:

void C2(int t)
{
    int i;
    var n="\r\n";
    var s="  "+string.Join("____",new string[1+t/2])+n;
    for(i=0;i++<=t;)
        s+=i%2<1?"\\ ":" /";
    s+=n;
    for(i=0;i++<=t;)
        s+=i%2<1?"__\\":"/";
    Console.WriteLine(s);
}

StringBuildersは高速で美しいものですが、バイト数を少なくしたい場合s+=はあなたの友人です。実際、forループはもう少しコンパクトにすることができます。++and --演算子の喜び/恐怖は、条件付きチェックでほとんどの作業を実行できることを意味しますfor(i=0;i++<=t;)(これは、i以下であるかどうかをチェックしt 、それをインクリメントします)。int iforループの外側を定義し、それを再利用するとうまくいくでしょう。また、i決して負ではないことを保証i%2==0できるので、に交換できますi%2<1。これらの変更により、サブ200バイトのスコアが簡単に得られます。
VisualMelon

1
また、アクセスするにEnumerableは通常using System.Linqディレクティブが必要なので、LINQPadなどでこれを作成したのではないかと思われます。一般的に、そのような句を含めることを意図していると思います。ただし、このインスタンスvar s=" "+string.Join("____",new string[1+t/2])+n;では、LINQを含まない、現在のコードよりも短いLINQ のみを置き換えることができます;)これは、多くのヌル文字列を、本当に気にかけている「____」(1 + t / 2前に別の「____」に合わせて別のヌル文字列が必要だからです)。変数nは「\ r \ n」として宣言されます。
VisualMelon

素晴らしいヒント!EnumerableにはSystem.Linqが必要であることを忘れていましたが、最近はほとんど注意を払っていません。forループのヒントは便利です!
トレント

Aは少し遅れていますが、使用して4つのバイトを救うことができるConsole.Write代わりにConsole.WriteLine
Metoniem

2

Java、185

String f(int n){int i;String s="";if(n>1){s="  ";for(i=0;i<n/2;i++)s+="____";s+='\n';}for(i=0;i<=n;)s+=i++%2<1?" /":"\\ ";s+='\n';for(i=0;i<=n;i++)s+=i%2<1?i<n?"/_":"/":"_\\";return s;}

説明

String f(int n) {
    int i;
    String s = "";
    if (n > 1) {
        s = "  ";
        for (i = 0; i < n / 2; i++) {
            s += "____";
        }
        s += '\n';
    }
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? " /" : "\\ ";
    }
    s += '\n';
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? i < n ? "/_" : "/" : "_\\";
    }
    return s;
}

2

C#の- 151 146 141 138

@bacchusbealeの答えに触発された

string f(int n){string t="\n",s=n>1?"  "+new string('_',n/2*4)+t:"";for(var b=n<0;n-->=0;t+=b?"__\\":"/",b=!b)s+=b?"\\ ":" /";return s+t;}

非ゴルフ

    string f(int n)
    {
        string t = "\n", s = n > 1 ? "  " + new string('_', n / 2 * 4) + t : "";
        for (var b = n < 0; n-- >= 0; t += b ? "__\\" : "/", b = !b)
            s += b ? "\\ " : " /";
        return s + t;
    }

1
いいね、他の答えにコメントする前にどうやってこれを見逃したかわからない!その過負荷はnew String私にとって新しいものです!あなたはt=""ゴルフバージョンからあなたを逃したようですが、より良いことはt「\ n」として初期化することです。tフリップする場所に追加bしてforループに「{}」を保存することで、数バイトを節約できますt+=(b=!b)?"/":"__\\"
VisualMelon

1
@tis では、t前に定義して、; ではなく文字列にs追加するtと、さらに数個保存できます"\n"
VisualMelon15年

1

行く、 156 144

func f(n int){a,b,c:="  ","","";for i:=0;i<=n;i++{if i<n/2{a+="____"};if i%2<1{b+=" /";c+="/"}else{b+=`\ `;c+=`__\`}};print(a+"\n"+b+"\n"+c)}

ゴルフをしていない:

func f(n int) {
    a, b, c := "  ", "", ""   // Initialize 3 accumulators
    for i := 0; i <= n; i++ { // For each required triangle
        if i < n/2 {          // Yay integer math
            a += "____"
        }
        if i%2 < 1 {          // Even, uneven, (are we drawing up or downslope?)
            b += " /"
            c += "/"
        } else {
            b += `\ `
            c += `__\`
        }
    }
    print(a + "\n" + b + "\n" + c)
}

ここでの唯一の本当のトリックは(そしてそれは良いものでもありません)3つのアキュムレータを使用することです。そのため、ソリューションを1つのループに凝縮できます。

コードはここで実行できます:http : //play.golang.org/p/urEO1kIjKv


c += `__\` 代わりに単に使用するif i<n{c+="_"}
-MarcDefiant

@MarcDefiant更新、ありがとう
クリストファーサルストルガード

1

> <>(FISH) 215の 183 156バイト

編集:Notepad ++はCRのために5バイト余分に与えていたので、それに応じてカウントを変更しました

少しゴルフをしましたが、これまでの私の最初のフィッシュプログラムです。

99+0{:}1=?.~~"  "oo:2,:1%-v
-1  oooo  "____"  v!?  )0:/!
" /"oa~~.?=1}:{24~/:oo
v!?)0:-1o"\"v!?)0:/!-1ooo"  /"
/v   ~o"/"oa/!
!\:0)?!;"\__"ooo1-:0)?!;"/"o1-

http://fishlanguage.com/でテストできます(長さの初期スタックのInt)

説明:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect

1
素敵な通訳!自分で作ったの?
Sp3000

わずかでも。:PIは、言語を自分自身に教え、デバッグするために広範囲に使用しました。私はちょうど言語が浮かんでいるのを見て、それが非常に面白いと思った(また、大理石を試してみたい)。
Fongoid

1

Perlの109 108 106

$i=<>;$t=join$/,$i-1?"  "."_"x($i/2)x4:(),$m.=(" /")[$_&1]||"\\ ",$b.=("/")[$_&1]||"__\\"for 0..$i;print$t

これは私の最初のゴルフでは大丈夫だと思います。最初の行にVynceのセクションを使用し、残りのコードで1つの三角形の新しい行の問題を乗り越えました。

今、私はそれを短縮できるかどうかを確認します:)

編集:ホワイトスペース

編集2:交換し"\n"$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/

1

C89、150

r(p,q,n)int*p,*q;{n?printf(p),r(q,p,n-1):puts(p);}main(c,v)int**v;{c=atoi(v[1]);if(c>1)printf("  "),r("","____",c-1);r(" /","\\ ",c);r("/","__\\",c);}

無償版:

r(p, q, n) char *p, *q; {
    if(n > 0) {
        printf(p);
        r(q, p, n-1); /* swap p and q */
    } else {
        puts(p);
    }
}

main(c, v) char**v; {
    c = atoi(v[1]);
    if(c>1) {
        printf("  ");
        r("", "____", c - 1);
    }
    r(" /", "\\ ", c);
    r("/", "__\\", c);
}

出力:

$ seq 1 3 10 | xargs -n1 ./triangles
 /\
/__\
  ________
 /\  /\  /
/__\/__\/
  ____________
 /\  /\  /\  /\
/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

私が入力するとスタックはオーバーフローします65535(ただし、-O3!でコンパイルした場合はそうではありません)が、理論的には動作するはずです;-)

edit:プログラムに1渡される場合、プログラムは 2行のみを出力するという要件を満たします。edit 2:のint*代わりに使用char*


あなたは宣言しmainmain(c,v)**v;いる作品であれば。
FUZxxl

cまたはnグローバル変数として何かを保存できるかどうか疑問に思っていたので、そのパラメータをに渡す必要はありませんr()。あなたの答えが準拠していないと思うNote that for 1 the output is two lines long but otherwise it's three. This is required.
レベルリバーセント

@FUZxxl残念ながらこれは機能しません:-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@steveverrillは修正しましたが、コードを長くする必要がありました。グローバルnまたはcそれより短いソリューションも見つかりませんでした。
-MarcDefiant

@MarcDefiantを渡すことができましたint**か?
-FUZxxl

1

C ++ stdlib、194バイト

string f(int n){char* p[]={"____"," /\\ ","/__\\"};int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;string s=n>1?"  ":"";for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")for (j=0;j<x[i];)s+=p[i][j++%4];return s;}

テストプログラム:

#include <string>
#include <iostream>

using namespace std;

string f(int n)
{
    char* p[]={"____"," /\\ ","/__\\"};
    int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;
    string s=n>1?"  ":"";
    for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")
        for (j=0;j<x[i];)
            s+=p[i][j++%4];
    return s;
}

int main(int argc, char* argv[])
{
    cout << f(10);
    return 0;
}

1

バッシュ、166の 127 125 119 105バイト

printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

関数内:

triangle() {
    printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
}

いくつかのプレゼンテーションで:

for i in {1..5} 10 31;do
    paste -d\  <(
        figlet -fsmall $i |
             sed 's/^/         /;s/^ *\(.\{10\}\)$/\1  /;$d'
    ) <(triangle $i)
  done

レンダリングする場合があります(figletがインストールされている場合):

        _      
       / |    /\  
       | |   /__\
       |_|   
      ___      ____
     |_  )    /\  /
      / /    /__\/
     /___|   
      ____     ____
     |__ /    /\  /\  
      |_ \   /__\/__\
     |___/   
     _ _       ________
    | | |     /\  /\  /
    |_  _|   /__\/__\/
      |_|    
      ___      ________
     | __|    /\  /\  /\  
     |__ \   /__\/__\/__\
     |___/   
   _  __       ____________________
  / |/  \     /\  /\  /\  /\  /\  /
  | | () |   /__\/__\/__\/__\/__\/
  |_|\__/    
    _____      ____________________________________________________________
   |__ / |    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |   /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|   

103の代わりに変数から入力する場合は2文字を保存します$1

printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

ループへ:

for i in {1..3} {31..34};do
    [ $i == 31 ] && figlet -fsmall ...
    paste -d\  <(
        figlet -fsmall $i |
            sed 's/^/         /;s/^ *\(.\{10\}\)$/\1   /;$d'
    ) <(
        printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
    )
  done

レンダリング(概算)同じ:

        _       
       / |     /\  
       | |    /__\
       |_|    
      ___       ____
     |_  )     /\  /
      / /     /__\/
     /___|    
      ____      ____
     |__ /     /\  /\  
      |_ \    /__\/__\
     |___/    


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     

1
figglet実装codegolfに関する質問を投稿してください!
sergiol

1

木炭、27バイト(非競合)

言語が課題を後回しにしているため競合しない。

FEN﹪鲫P×⁴_↗⊗¬ι↓P↘²↘⊗ι↑P↗⊗ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

FEN﹪鲫

長さの交互ビットのリストを生成し、nそれらをループします。

P×⁴_

____カーソルを動かさずに描画します。

↗⊗¬ι↓

最初の1つおきの三角形で、左側を描画し/ます。

P↘²

\カーソルを動かさずに辺を描きます。

↘⊗ι↑

2つ目と1つおきの三角形で、\もう一度左側を描画してカーソルを移動します。

P↗⊗ι

2つ目と1つおきの三角形で/、カーソルを動かさずに右側を描画します。


1
回答はもはや非競合としてマークする必要はありません
ジョー・キング

1

PowerShell116 95バイト

21バイトを節約してくれたMazzyとASCII-Onlyに大きな感謝

param($n)@("  "+"_"*4*($x=$n-shr1))[$n-eq1]
" /"+"\  /"*$x+"\"*($a=$n%2)
"/"+"__\/"*$x+"__\"*$a

オンラインでお試しください!

n = 1の空行を許可しないと、14 10バイトのように食いつぶされました。このソリューションは、死んでかなり脳今はるかに賢い繰り返し最小限のコードを持ちます。銀行家の丸めは、依然として実際の悪魔です。


空行は許可されていませんか???
ASCIIのみ

@ASCIIのみOPから4番目の箇条書きを読み取ります。
ヴェスカー


1
ASCIIのみ@ X = 3でブレークどのようにバンカーの丸めバイパス文字列が置き換えられている
Veskah

1
@mazzy最初の行を生成することはできません。そうでなければ、102
ASCIIのみ

0

C、368バイト

void p(char* c){printf(c);}
int x(int s,int f){int t=0,p=s;for(int i=0;i<f;i++){if(p==1){t++;p=0;}else{p=1;}}return t;}
int main(int argc,char* argv[]){int t=atoi(argv[1]);if(t>1){p("  ");for(int i=0;i<x(0,t);i++)
{p("____");}p("\n");}for(int i=0;i<x(1,t);i++){p(" /\\ ");}if(t%2==0){p(" /");}p("\n");
for(int i=0;i<x(1,t);i++){p("/__\\");}if(t%2==0){p("/");}p("\n");}

#includeステートメントを数えるともっと多くなりますが、警告はありますが、ステートメントなしでgccでコンパイルされます。私はそれが断然最短ではないことを知っていますが、私はそれが好きです、私はCでそれをしました。


マクロ#define p(c)printf(c)は関数よりも短いです。関数の戻り値の型は省略できます(デフォルトはint)。C89このようなスタイルで関数を定義することもできますmain(c,v)char**v;{}。それは短いint main(int c, char** v){}
-MarcDefiant

0

Perlの(シンプル)131 125 120

かなり簡単な最初のパス:

$i=<>;print join"\n",$i-1?"  "."_"x(4*int($i/2)):(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

誰が明示的なintを必要としますか?

$i=<>;print join"\n",$i-1?"  "."_"x($i/2)x4:(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

0

プロローグ、126バイト

A+B:-writef(A,B).
$N:-(N>1,"  %r\n"+['____',N//2];!),(0is N/\1,T='/';T='')," %r%w\n"+['/\\  ',N/2,T],"%r%w\n"+['/__\\',N/2,T].

のように呼び出し$3ます。

より読みやすい:

triangle(N):-
    (   N > 1
    ->  writef("  %r\n", ['____', N//2])
    ;   true
    ),
    (   0 is N mod 2
    ->  T = '/'
    ;   T = ''
    ),
    writef(" %r%w\n", ['/\\  ', N/2, T]),
    writef("%r%w\n", ['/__\\', N/2, T]).

例:

?- findall(N,between(1,10,N),NN), maplist($, NN), !.
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/
NN = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].

0

C#:1行のLINQ、198バイト

string f(int n){return(n>1?"  ":"")+string.Join("\n",new[]{"____"," /\\ ","/__\\"}.Zip(new[]{(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},(s,l)=>string.Join(s,new string[n+1]).Substring(0,l)).Where(x=>x.Any()));}

0

網膜、88バイト(非競合)

言語が課題を後回しにしているため競合しない。

K`  ____¶ /\  /¶/__\/
%`....$
$+*$&
%`(.+)\1$
$1
(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4
G`\S

オンラインでお試しください!説明:

K`  ____¶ /\  /¶/__\/

入力を三角形のペアで置き換えます。

%`....$
$+*$&

元の入力で三角形を乗算します。

%`(.+)\1$
$1

三角形を2で割ります。

(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4

残りの半分の三角形を削除します。

G`\S

最初の行が空白になっている場合は削除します。




0

05AB1E、37 バイト

≠iðð'_I2÷4*×J}„ /„\ ‚I>∍J'/…__\‚I>∍J»

オンラインそれを試してみてくださいまたは最初の10個の出力を確認します

説明:

i            } # If the (implicit) input is NOT 1:
                #   i.e. 1 → 0 (falsey)
                #   i.e. 5 → 1 (truthy)
  ðð            #  Push two spaces "  "
    '_         '#  Push string "_"
      I         #  Push the input
       2÷       #  Integer-divide it by 2
                #   i.e. 5 → 2
         4*     #  And then multiply it by 4
                #   i.e. 2 → 8
           ×    #  Repeat the "_" that many times
                #   i.e. "_" and 8 → "________"
            J   #  Join everything on the stack together to a single string
                #   i.e. "  ________"
 /             # Push string " /"
   \           # Push string "\ "
               # Pair them together: [" /","\ "]
      I>        # Push the input+1
               # Extend the list to that size
                #  i.e. [" /","\ "] and 2 → [" /","\ "]
                #  i.e. [" /","\ "] and 6 → [" /","\ "," /","\ "," /","\ "]
         J      # Join the list together to a single string
                #  i.e. [" /","\ "] → " /\ "
                #  i.e. [" /","\ "," /","\ "," /","\ "] → " /\  /\  /\ "
'/             '# Push string "/"
  __\          # Push string "__\"
               # Pair them together: ["/","__\"]
       I>       # Push the input+1
               # Extend the list to that size
                #  i.e. ["/","__\"] and 2 → ["/","__\"]
                #  i.e. ["/","__\"] and 6 → ["/","__\","/","__\","/","__\"]
          J     # Join the list together to a single string
                #  i.e. ["/","__\"] → "/__\"
                #  i.e. ["/","__\","/","__\","/","__\"] → "/__\/__\/__\"
»               # Join the entire stack with a newline delimiter
                #  i.e. " /\ " and "/__\" → " /\ \n/__\"
                #  i.e. "  ________", " /\  /\  /\ " and "/__\/__\/__\"
                #   → "  ________\n /\  /\  /\ \n/__\/__\/__\"
                # (and output the result implicitly)

0

Java 11、122バイト

n->(n>1?"  "+"_".repeat(n/2*4)+"\n":"")+" /\\ ".repeat(n).substring(0,++n*2)+"\n"+"/__\\".repeat(n).substring(0,n/2*4+n%2)

オンラインでお試しください。

説明:

n->                   // Method with integer parameter and String return-type
  (n>1?               //  If the input is larger than 1:
    "  "              //   Return two spaces
    +"_".repeat(      //   Appended with "_" repeated the following amount of times:
          n/2         //    The input integer-divided by 2
             *4)      //    And then multiplied by 4
    +"\n"             //   Appended with a newline
   :                  //  Else:
    "")               //   Return nothing
  +" /\\ ".repeat(n)  //  Appended with " /\ " repeated the input amount of times
    .substring(0,     //   After which we only leave the first `x` characters, where `x` is:
      ++n             //    Increase the input by 1 first with `++n`
         *2)          //    And then multiply it by 2
                      //     i.e. For input 1, `x` becomes 4 here
                      //     i.e. For input 6, `x` becomes 14 here
  +"\n"               //  Appended with a newline
  +"/__\\".repeat(n)  //  Appended with "/__\" repeated the input amount of times
    .substring(0,     //   After which we only leave the first `y` characters, where `y` is:
      n/2             //    The input+1 integer-divided by 2
         *4           //    Then multiplied by 4
           +n%2)      //    And then the input+1 modulo-2 added
                      //     i.e. For input 1, `y` becomes 4 here
                      //     i.e. For input 6, `y` becomes 13 here
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.