ASCIIの三角形


30

あなたの仕事は、ASCII三角形を印刷するプログラムまたは関数を書くことです。次のようになります。

|\
| \
|  \
----

プログラムはn、制約付きの単一の数値入力を受け取ります0 <= n <= 1000。上記の三角形の値はでしたn=3

ASCIIの三角形にはnバックスラッシュ(\)と垂直バー(|)、n+1行とダッシュ(-)があり、各行には最終的な行のほかに行番号(0から始まる、つまり最初の行は行0)と等しいスペースがあります。 。

例:

入力:

4

出力:

|\
| \
|  \
|   \
-----

入力:

0

出力:


このテストケースでは、出力は空でなければなりません。空白なし。

入力:

1

出力:

|\
--

入力と出力は、私が指定したとおりでなければなりません。

これはなので、できるだけ短いコードを目指してください!

code-golf  ascii-art  code-golf  rubiks-cube  code-golf  path-finding  maze  regular-expression  code-golf  math  rational-numbers  code-golf  kolmogorov-complexity  graphical-output  code-golf  tips  code-golf  string  permutations  code-golf  sorting  base-conversion  binary  code-golf  tips  basic  code-golf  number  number-theory  fibonacci  code-golf  date  code-golf  restricted-source  quine  file-system  code-golf  code-golf  math  code-golf  ascii-art  code-golf  math  primes  code-golf  code-golf  math  matrix  code-golf  string  math  logic  factorial  code-golf  palindrome  code-golf  quine  stateful  code-golf  interactive  code-golf  board-game  code-golf  math  arithmetic  code-golf  string  code-golf  math  matrix  code-golf  math  abstract-algebra  polynomials  code-golf  date  code-golf  string  array-manipulation  sorting  code-golf  game  code-golf  string  code-golf  ascii-art  decision-problem  code-golf  number  sequence  code-golf  code-golf  code-golf  sequence  fibonacci  code-golf  math  geometry  random  code-golf  code-golf  math  decision-problem  fractal  rational-numbers  code-golf  number  number-theory  code-golf  combinatorics  permutations  card-games  code-golf  math  sequence  array-manipulation  fibonacci  code-golf  sequence  decision-problem  graph-theory  code-golf  ascii-art  parsing  lisp  code-golf  string  math  natural-language  logic  code-golf  math  logic  code-golf  string  alphabet  code-golf  string  code-golf  string 

4
プログラムである必要がありますか、それとも関数になることができますか?
fənɛtɪk

7
私はケースがあれば、それは良いだろうと思います0(あなたはダッシュの数が1以上の入力数よりでなければならないことを要求され、特に以来)それは極端なケースであるため、予期しない出力を持つことができます
KritixiのLithos

4
@Okx質問者がプログラムを言うが、実際にはプログラムまたは機能を意味する質問が頻繁にあります。あなたは完全なプログラムを求めていることを明確にしたいかもしれません
fənɛtɪk

9
は間違いなくプログラムと機能の両方に行きます。他に何も指定されていない場合、これがデフォルトのルールです。「n + 1行とダッシュ(-)」の直接違反であるため、0エッジのケースも削除します。
スティーヴィーグリフィン

3
チャレンジは、size = 0例外がなければ簡単すぎます。課題の一部は、最小限の追加コードでこれを説明する方法を見つけることです。
12Me21

回答:


3

ゼリー、14バイト

’⁶x⁾|\jṄµ€Ṫ”-ṁ

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

使い方。

’⁶x⁾|\jṄµ€Ṫ”-ṁ  Main link. Argument: n

        µ       Combine the links to the left into a chain.
         €      Map the chain over [1, ..., n]; for each k:
’                 Decrement; yield k-1.
 ⁶x               Repeat the space character k-1 times, yielding a string.
   ⁾\j            Join the character array ['|', '\'], separating by those spaces.
      Ṅ           Print the result, followed by a linefeed.
         Ṫ      Tail; extract the last line.
                This will yield 0 if the array is empty.
          ⁾-ṁ   Mold the character '-' like that line (or 0), yielding a string
                of an equal amount of hyphen-minus characters.  

11

C、58バイト

i;f(n){for(i=2*n;~i--;printf(i<n?"-":"|%*c\n",2*n-i,92));}

-

この回答に対するコメントを寄せてくれた@Steadyboxのおかげで、上記のソリューションで数バイト削ることができました


1
私はかなり誇りに思って自分のした、68に到達するために管理...そして私は:(スクロール-まあやった!
クエンティン・

1
非常に素晴らしい!+1がある
Steadybox

私は2*nそこに2回いますが、それは私を悩ませます、誰かが何らかの形でそれを短くする賢い方法を考えることができますか?
アルバートレンショー

7

Javascript(ES6)、97 85 81 75 74バイト

n=>(g=(n,s)=>n?g(--n,`|${" ".repeat(n)}\\
`+s):s)(n,"")+"-".repeat(n&&n+1)

私はほとんど十分な再帰を使用していなかったことが判明しました

f=n=>(g=(n,s)=>n?g(--n,`|${" ".repeat(n)}\\
`+s):s)(n,"")+"-".repeat(n&&n+1)

console.log(f(0))
console.log(f(1))
console.log(f(2))
console.log(f(3))
console.log(f(4))


6

05AB1E16 15 16バイト

Adnanのおかげで1バイト節約

FðN×…|ÿ\}Dg'-×»?

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

説明

F       }         # for N in range [0 ... input-1]
 ðN×              # push <space> repeated N times
    …|ÿ\          # to the middle of the string "|\"
         Dg       # get length of last string pushed
           '-×    # repeat "-" that many times
              »   # join strings by newline
               ?  # print without newline

ð×.svy¦…|ÿ\}¹>'-×»、私の考えは.s思ったほど良くなかったと思います。のいい使い方はÿ、これまで見たことがない。
魔法のタコUr

@carusocomputing:私は最初から考え.sただけでなく<Ýð×、これらのメソッドの特殊なケースで問題に遭遇しました。
エミグナ

FðN×…|ÿ\}Dg'-×»15バイト
アドナン

@アドナン:いいキャッチDg!ありがとう:)
エミグナ

.sまた、より多くのバイトを必要とするネストされた配列とフラット化をもたらしました。
魔法のタコUr

5

V18 17 16バイト

入力が次の場合に何も出力しない別の方法を使用した@ nmjcman101のおかげで1バイト節約 0

é\é|ÀñÙá ñÒ-xÀ«D

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

Hexdump:

00000000: e95c e97c c0f1 d9e1 20f1 d22d 78c0 ab44  .\.|.... ..-x..D

説明(古い)

最初に、引数がであるかどうかを確認するループがあります0。その場合、以下のコードが実行されます(|\書き込まれます)。それ以外の場合、何も書き込まれず、バッファーは空です。

Àñ     ñ            " Argument times do:
  é\é|              " Write |\
      h             " Exit loop by creating a breaking error

三角形の頂点を取得したので、その本体を作成する必要があります。

Àñ   ñ              " Argument times do:
  Ù                 " Duplicate line, the cursor comes down
   à<SPACE>         " Append a space

これで、バッファーの下部に1行追加されました。これは-s に置き換える必要があります。

Ó-                  " Replace every character with a -
   x                " Delete the extra '-'

入力に必要なものが何であれ、この答えは短くなります 0

V14 13バイト

é\é|ÀñÙá ñÒ-x

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


私はバイトのために一生懸命それを試してはいけませんでしたオンラインで試してみてください!
nmjcman101

@ nmjcman101ああ、«もちろん。賢い!:)
Kritixi Lithos

4

C#、93バイト

n=>{var s=n>0?new string('-',n+1):"";while(n-->0)s="|"+new string(' ',n)+"\\\n"+s;return s;};

ASCII三角形を文字列として返す無名関数。

コメントなしのコメント付きの機能とテストケースを含む完全なプログラム:

using System;

class ASCIITriangles
{
    static void Main()
    {
      Func<int, string> f =
      n =>
      {
          // creates the triangle's bottom, made of dashes
          // or an empty string if n == 0
          var s = n > 0 ? new string('-', n + 1) : "";

          // a bottom to top process
          while ( n-- > 0)
          // that creates each precedent line
            s = "|" + new string(' ', n) + "\\\n" + s;

          // and returns the resulting ASCII art
          return s;
      };

      // test cases:
      Console.WriteLine(f(4));
      Console.WriteLine(f(0));
      Console.WriteLine(f(1));
    }
}

3

Python 2、69バイト

lambda x:'\n'.join(['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)])

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


あなたはそれを印刷している場合、あなたは、のpython3に変える除去することによって、いくつかのバイトを保存することができます"".joinし、それを交換*演算子とsepそう、スリープ機能で引数lambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp

3

CJam24 22 21バイト

Martin Enderのおかげで1バイト節約

ri_{S*'|\'\N}%\_g+'-*

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

説明

ri                     e# Take an integer from input
  _                    e# Duplicate it
   {                   e# Map the following to the range from 0 to input-1
    S*                 e#   Put that many spaces
      '|               e#   Put a pipe
        \              e#   Swap the spaces and the pipe
         '\            e#   Put a backslash
           N           e#   Put a newline
            }%         e# (end of map block)
              \        e# Swap the top two stack elements (bring input to the top)
               _g+     e# Add the input's signum to itself. Effectively this increments any 
                       e#  non-zero number and leaves zero as zero.
                  '-*  e# Put that many dashes

2

SmileBASIC、51バイト

INPUT N
FOR I=0TO N-1?"|";" "*I;"\
NEXT?"-"*(N+!!N)

2

PowerShell51 67バイト

param($n)if($n){1..$n|%{"|"+" "*--$_+"\"};write-host -n ('-'*++$n)}

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

(末尾の改行がないため、バイトが増加します)

入力を受け取り$n、それがゼロでないことを確認します。次に、ループを作成して三角形を作成し、の行で終了し-ます。暗黙Write-Outputはプログラムの完了時に発生します。


プログラムは末尾の改行を出力しますが、出力が指定どおりになるように要求しました。ごめんなさい!
Okx

@Okx 16バイトのコストで変更されました。
AdmBorkBork

2

網膜、39バイト

.*
$*
*\`(?<=(.*)).
|$.1$* \¶
1
-
-$
--

オンラインで試す

10進入力を単項に変換します。それぞれ1|<N-1 spaces>\¶で置き換え、印刷し、置き換えを取り消します。それぞれ1をハイフンで置き換え、最後のハイフンを2つのハイフンで置き換えます。タダー!


2

Common Lisp、 89 86バイト

n入力を受け取り、三角形を*standard-output*出力する匿名関数を作成します(デフォルトではstdout)。

ゴルフ

(lambda(n)(when(< 0 n)(dotimes(i n)(format t"|~v@t\\~%"i))(format t"~v,,,'-<~>"(1+ n))))

非ゴルフ

(lambda (n)
  (when (< 0 n)
    (dotimes (i n)
      (format t "|~v@t\\~%" i))
    (format t "~v,,,'-<~>" (1+ n))))

どうにかしてこれを短くできると確信しています。


2

C 101 93 75バイト

f(n){i;for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)prin‌​tf("-");}

ゴルフされていないバージョン

void f(int n)
{
  int i;

  for(i=0;i++<n;)
    printf("|%*c\n",i,92);

  for(;n--+1;)
    printf("-");

}

@Steadybox指摘してくれてありがとう、とても理にかなっています。


1
文字定数をASCII値に置き換え、ループ本体の最初のi ++を移動することにより、数バイトを削ることができます。そしてなぜprintf("%c",'_');そんなに冗長なのでしょうか?
イェンス

@Jens stimmt、ダンケたsehr :)更新
アベルトム

これは、74バイトに削減することができる:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox

実際には69バイトまでi;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox

@Steadybox 68:n--+1短縮可能~n--
アルバートレンショー

2

、15バイト

Nβ¿β«↓β→⁺¹β↖↖β»

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

壊す

Nβ¿β«↓β→⁺¹β↖↖β»
Nβ               assign input to variable β
   ¿β«         »  if β != 0:
      ↓β           draw vertical line β bars long
        →⁺¹β       draw horizontal line β+1 dashes long
            ↖      move cursor up one line and left one character
             ↖β    draw diagonal line β slashes long

非常に遅いコメントですが、締め切り»は省略できます。
DLosc

2

Japt、20バイト

@ETHproductionsのおかげで2バイト節約

o@'|+SpX +'\Ãp-pUÄ)·

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

説明

o@'|+SpX +'\Ãp-pUÄ)·
o                       // Creates a range from 0 to input
 @                      // Iterate through the array
  '|+                   // "|" + 
     SpX +              // S (" ") repeated X (index) times +
          '\Ã            // "\" }
             p-pU       // "-" repeated U (input) +1 times
                 Ä)·    // Join with newlines

1
良いですね!結合する前に最後の行をプッシュすることで1バイトを保存できます。o@'|+SpX +'\Ãp'-pUÄ)·バグ(実際には自動機能の意図しない副作用)により、'inを削除できます'-
-ETHproductions

実際には、だけでなく、すべて小文字のようになっていますp。そのため、たとえばm*2、各要素を2倍にしたり、各要素mp2を2乗したりすることができます
-ETHproductions

2

J、20バイト

bobのおかげで-13バイト

*#' \|-'{~3,~2,.=@i.

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

オリジナル:33バイト

(#&'| \'@(1,1,~])"0 i.),('-'#~>:)

食べない

(#&'| \' @ (1,1,~])"0 i.) , ('-'#~>:)

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


25バイト*,&'-' '|',.'\'{."0~_1-i.
マイル

22バイト*,&'-' '|',.' \'{~=@i.
ボブ

@bob IDマトリックスを使用することは非常に賢明でした
マイル

@bob提案をありがとう。投稿を更新しました
ジョナ


1

Python2、73バイト

n=input()
w=0
exec'print"|"+" "*w+"\\\\"+("\\n"+"-"*-~n)*(w>n-2);w+=1;'*n

完全なプログラム。最後の行の文字列補間も試しましたが、数バイト長くなりました:/

exec'print"|%s\\\\%s"%(" "*w,("\\n"+"-"*-~n)*(w>n-2));w+=1;'*n

73バイトの別のソリューション:

n=j=input()
exec'print"|"+" "*(n-j)+"\\\\"+("\\n"+"-"*-~n)*(j<2);j-=1;'*n

テストケース

0:

1:
|\
--

2:
|\
| \
---

3:
|\
| \
|  \
----

6:
|\
| \
|  \
|   \
|    \
|     \
-------

以前のコメントをおaびします。機能が許可されました。
Okx

@Okx問題ありません。これは完全なプログラムです。関数ソリューションのファッションを検討するつもりはありません:)
Yytsi

1

MATL、19バイト

?'\|- '2GXyYc!3Yc!)

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

?         % Implicit input. If non-zero
  '\|- '  %   Push this string
  2       %   Push 2
  G       %   Push input
  Xy      %   Identity matrix of that size
  Yc      %   Prepend a column of 2's to that matrix
  !       %   Transpose
  3       %   Push 3
  Yc      %   Postpend a column of 3's to the matrix
  !       %   Transpose
  )       %   Index into string
          % Implicit end. Implicit display

1

QBIC、41バイト

:~a>0|[a|?@|`+space$(b-1)+@\`][a+1|Z=Z+@-

説明

:~a>0|  Gets a, and checks if a > 0
        If it isn't the program quits without printing anything
[a|     For b=1; b <= a; b++
?@|`+   Print "|"
space$  and a number of spaces
(b-1)   euqal to our current 1-based line - 1
+@\`    and a "\"
]       NEXT
[a+1|   FOR c=1; c <= a+1; c++
Z=Z+@-  Add a dash to Z$
        Z$ gets printed implicitly at the end of the program, if it holds anything
        The last string literal, IF and second FOR loop are closed implicitly.

1

R、101バイト

for(i in 1:(n=scan())){stopifnot(n>0);cat("|",rep(" ",i-1),"\\\n",sep="")};cat("-",rep("-",n),sep="")

このコードは、!n=0のみを考慮する場合、テストケースに準拠していますSTDOUT
実際、このstopifnot(n>0)部分はスクリプトの実行を停止し、へのSTDOUT書き込みのみError: n > 0 is not TRUEを表示しますSDTERR

アンゴルフド:

for(i in 1:(n=scan()))
    {
    stopifnot(n>0)
    cat("|", rep(" ", i-1), "\\\n", sep = "")
    }

cat("-", rep("-", n), sep = "")

1
ungolfedのスペルを修正したい場合があります
fəˈnɛtɪk

1

Python 2、62バイト

n=input();s='\\'
exec"print'|'+s;s=' '+s;"*n
if n:print'-'*-~n

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

バックスラッシュの前に別のスペースを追加するたびに、行ごとに印刷します。印刷しない関数が許可される場合、それはおそらく短くなります。


どうやら、関数は印刷する必要はありません。
Yytsi

1

JavaScript(ES6)、71バイト

f=
n=>console.log(' '.repeat(n).replace(/./g,'|$`\\\n')+'-'.repeat(n+!!n))
<form onsubmit=f(+i.value);return!true><input id=i type=number><input type=submit value=Go!>

コンソールへの出力。SpiderMonkey JavaScriptシェルへの印刷が許容される場合、6バイトを節約します。出力を返すことが許容される場合、13バイトを節約します。


その正規表現は独創的です。私は最初にそれらの線に沿って何かを試しました。私はその$`パターンについては知りませんでしたが、まだ考えていたかどうかはわかりません。いいね
ヤン



1

Perl、63バイト

$n=shift;print'|',$"x--$_,"\\\n"for 1..$n;print'-'x++$n,$/if$n

ゴルフをしていない:

$ perl -MO=Deparse triangle.pl
$n = shift @ARGV;
print '|', $" x --$_, "\\\n" foreach (1 .. $n);
print '-' x ++$n, $/ if $n;

$"リスト区切り文字で、デフォルトは「」です。 $/出力レコード区切り文字です。デフォルトは「\ n」です。 $_暗黙のループ変数です。


1
おそらくstdinの入力を読み取ることでいくつかを節約できますか?$n=<>
ヴェン


1

Pyth、23 18バイト

VQ++\|*dN\\)IQ*\-h

オンラインで利用可能なテストスイート。5バイトのゴルフをして
くれたVenに感謝します。

説明

VQ++\|*dN\\)IQ*\-h
 Q           Q    Q  [Q is implicitly appended, initializes to eval(input)]
       d             [d initializes to ' ' (space)]
VQ         )         For N in range(0, eval(input)):
      *dN             Repeat space N times
   +\|                Prepend |
  +      \\           Append \
                      Implicitly print on new line
            IQ       If (input): [0 is falsy, all other valid inputs are truthy]
                 hQ   Increment input by 1
              *\-     Repeat - that many times
                      Implicitly print on new line

@Venありがとう!|追加のバイトの最後を切り捨てることができます。
マイクブファルデシ

0

Javascript 101(フルプログラム)、94(関数出力)、79(リターン)バイト

フルプログラム

Chromeで実行されない(プロセスが存在しないように見える)
TIOで実行されない(プロンプトが明らかに許可されていないため)

x=prompt();s='';for(i=0;i<x;i++)s+='|'+' '.repeat(i)+`\\
`;process.stdout.write(s+'-'.repeat(x&&x+1))

EXACT印刷機能

x=>{s='';for(i=0;i<x;)s+='|'+' '.repeat(i++)+`\\
`;process.stdout.write(s+'-'.repeat(x&&x+1))}

オンラインで試す

戻り文字列を持つ関数

x=>{s='';for(i=0;i<x;)s+='|'+' '.repeat(i++)+`\\
`;return s+'-'.repeat(x&&x+1)}

オンラインで試す

Javascriptでの文字の繰り返しは馬鹿げているため、出力の改行を抑制しています


0

Python 2、82バイト

def f(i,c=0):
 if c<i:print'|'+' '*c+'\\';f(i,c+1)
 print'-'*((c+1,c)[c<1]);exit()

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

他のPythonが答えるよりも長いが、異なるだけの再帰関数。

2つのprintステートメントを使用するのはもったいないように感じますが、それより短い方法を見つけることはできません。また、三角形exit()-下の数を減らして印刷を停止するための無駄7 。


あなたは行うことができます-~c*(c>0)3バイト:)保存するために、最後の行に
Yytsi

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