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예기치 않은 출력을 가질 수는 (당신이 대시의 수를 한 번 더 입력 된 숫자보다해야한다는 요청 특히 이후) 가장자리 케이스이기 때문에
Kritixi LITHOS

4
@Okx asker가 프로그램을 말하지만 실제로 프로그램이나 기능을 의미하는 질문이 자주 있습니다. 당신은 당신이 전체 프로그램을 요구하고 있음을 분명히하고 싶을 수도 있습니다
fəˈnɛtɪk

9
나는 분명히 프로그램과 기능 모두에 갈 것입니다. 다른 것을 지정하지 않으면 기본 규칙입니다. 또한 " n + 1 줄과 대시 (-) "를 직접 위반하기 때문에 0- 가장자리를 제거합니다 .
Stewie Griffin

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
아주 좋아요!
Steadybox

나는 2*n두 번 거기에 있고 그것은 나를 귀찮게, 어떻게 든 그것을 단축 할 수있는 영리한 방법을 생각할 수 있습니까?
Albert Renshaw

7

자바 스크립트 (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

05AB1E , 16 15 16 바이트

Adnan 덕분에 바이트 절약

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만큼 좋지 않았다고 생각합니다. 의 좋은 사용은 ÿ전에 본 적이 없습니다.
Magic Octopus Urn

@ carusocomputing : .s처음부터 고려 <Ýð×했지만 그 방법으로 특별한 경우에 문제가 발생했습니다.
Emigna

FðN×…|ÿ\}Dg'-×»for 15 bytes
Adnan

@Adnan : 멋진 캐치 Dg! 감사합니다 :)
Emigna

.s또한 중첩 배열과 병합으로 더 많은 바이트가 필요했습니다.
Magic Octopus Urn

5

V , 18 17 16 바이트

입력이 다른 경우 아무것도 출력하지 않는 다른 방법을 사용하기 위해 @ nmjcman101 덕분에 1 바이트가 절약되었습니다. 0

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

온라인으로 사용해보십시오!

16 진 덤프 :

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

이제 버퍼 하단에 한 줄이 추가되었습니다. -s 로 교체해야 합니다.

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

우리가 원하는 것을 입력 할 수 있다면이 대답은 더 짧을 것입니다 0

V , 14 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 삼각형을 문자열로 반환하는 익명 함수

ungolfed, 주석 기능 및 테스트 사례가 포함 된 전체 프로그램 :

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

파이썬 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

CJam , 24 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

PowerShell , 51 67 바이트

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

온라인으로 사용해보십시오!

(후행 줄 바꿈이 없기 때문에 바이트 증가)

입력을 받아서 $n0이 아닌지 확인합니다. 그런 다음 반복하여 삼각형을 구성하고의 선으로 끝납니다 -. Write-Output프로그램이 완료되면 암시 적으로 발생합니다.


이 프로그램은 후행 줄 바꿈을 인쇄하지만 출력을 정확히 지정된대로 요청했습니다. 죄송합니다!
Okx

@Okx 16 바이트의 비용으로 변경되었습니다.
AdmBorkBork

2

망막 , 39 바이트

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

온라인으로 사용해보십시오

십진수 입력을 단항으로 변환합니다. 각각을 1로 교체 |<N-1 spaces>\¶하고 인쇄하고 교체를 취소하십시오. 각각 1하이픈으로 바꾸고 마지막 하이픈은 2 하이픈으로 바꿉니다 . 타다 아!


2

일반적인 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

@Jens stimmt, Danke sehr :) 업데이트
Abel Tom

이것은 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
좋은 것! 결합하기 전에 마지막 행을 밀어서 바이트를 절약 할 수 있습니다 o@'|+SpX +'\Ãp'-pUÄ)·. 버그 (실제로 의도하지 않은 자동 기능의 부작용)로 인해 'in 을 제거 할 수 있습니다 '-.
ETHproductions

실제로, 그것은뿐만 아니라 모든 소문자와 같습니다 p. 당신이 예를 들면 할 수 있도록 그건 m*2각 요소를 두 배로, 또는 mp2각 정사각형
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

@bob 즉 행렬 사용하는 것이 매우 영리
마일

@bob 제안에 감사드립니다. 게시물을 업데이트했습니다
Jonah


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:
|\
| \
|  \
|   \
|    \
|     \
-------

이전 의견에 대해 사과드립니다. 이제 기능이 허용됩니다.
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

파이썬 2 , 62 바이트

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

온라인으로 사용해보십시오!

백 슬래시 전에 다른 공간을 추가 할 때마다 한 줄씩 인쇄합니다. 인쇄하지 않는 기능이 허용되면 더 짧을 수 있습니다.


분명히 기능은 인쇄 할 필요가 없습니다.
Yytsi

1

자바 스크립트 (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 바이트를 저장하십시오.


그 정규식은 독창적입니다. 나는 먼저 그 라인을 따라 무언가를 시도했다. 나는 그 $`패턴 에 대해 모른다 . 그러나 내가 아직도 그것을 생각 했을지 모른다 . 좋은.
Jan


1

파이썬 3 , 60 바이트

f=lambda n,k=0:k<n and'|'+' '*k+'\\\n'+f(n,k+1)or'-'[:n]*-~n

온라인으로 사용해보십시오!

동일한 바이트 수를 가진 두 가지 솔루션이 더 있습니다.

f=lambda n,k=0:n and'|'+' '*k+'\\\n'+f(n-1,k+1)or-~k*'-'[:k]
f=lambda n,s='|':-~n*'-'[:n]if s[n:]else s+'\\\n'+f(n,s+' ')

1

펄, 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=<>?
Ven


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 감사합니다! |추가 바이트 의 마지막 을 잘라낼 수 있습니다 .
Mike Bufardeci

0

자바 스크립트 101 (Full Program), 94 (Function Output), 79 (Return) 바이트

전체 프로그램

Chrome에서 실행되지 않음 (프로세스가 존재하지 않기 때문에)
TIO에서 실행되지 않습니다 (프롬프트가 허용되지 않음)

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

정확한 인쇄 기능

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

온라인으로 사용해보십시오

자바 스크립트에서 문자를 반복하는 것은 바보이므로 출력에서 ​​줄 바꿈이 억제됩니다.


0

파이썬 2 , 82 바이트

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

온라인으로 사용해보십시오!

다른 파이썬이 응답하지만 재귀 함수가 다르면 더 길어집니다.

print문장을 사용하면 낭비가 되지만 더 짧은 길을 찾을 수는 없습니다. 또한 exit()폐기물 (7) -은 삼각형 아래의 수를 감소시켜 인쇄를 중지시킨다 .


-~c*(c>0)마지막 줄에서 3 바이트를 절약 할 수 있습니다 :)
Yytsi

또는 더 나은 : c and-~c.
Yytsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.