Trójkąty ASCII

30

Twoim zadaniem jest napisanie programu lub funkcji, która wypisze trójkąt ASCII. Wyglądają tak:

|\
| \
|  \
----

Twój program pobierze pojedyncze dane liczbowe nz ograniczeniami 0 <= n <= 1000. Powyższy trójkąt miał wartość n=3.

Trójkąt ASCII będzie miał nukośniki odwrotne ( \) i pionowe paski ( |), n+1linie i myślniki ( -), a każda linia będzie miała liczbę spacji równą liczbie linii (na podstawie 0, tj. Pierwsza linia to linia 0) oprócz linii ostatecznej .

Przykłady:

Wkład:

4

Wydajność:

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

Wkład:

0

Wydajność:


W tym przypadku testowym dane wyjściowe muszą być puste. Brak białych znaków.

Wkład:

1

Wydajność:

|\
--

Dane wejściowe i wyjściowe muszą być dokładnie takie, jak określiłem.

To jest , więc celuj w możliwie najkrótszy kod!

Okx
źródło
4
Czy to musi być program, czy może funkcja?
fəˈnɛtɪk
7
Myślę, że byłoby lepiej, gdyby 0wielkość liter mogła mieć nieoczekiwany wynik, ponieważ jest to
wielkość graniczna
4
@Okx Często pojawiają się pytania, w których pytający mówi program, ale tak naprawdę oznacza program lub funkcję. Możesz wyjaśnić, że prosisz o pełny program
fəˈnɛtɪk
9
Ja na pewno tam zarówno programu jak i funkcji. Jest to domyślna reguła, jeśli nie określono nic innego. Chciałbym również usunąć wielkość 0-krawędzi, ponieważ jest to bezpośrednie naruszenie „ n + 1 linii i myślników (-) ”.
Stewie Griffin
3
Wyzwanie byłoby zbyt proste bez wyjątku size = 0. Częścią wyzwania jest znalezienie sposobu, aby to uwzględnić przy najmniejszej ilości dodatkowego kodu.
12Me21

Odpowiedzi:

3

Galaretka , 14 bajtów

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

Wypróbuj online!

Jak to działa.

’⁶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.  
Dennis
źródło
11

C, 58 bajtów

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

-

Dzięki @Steadybox, który komentarze do tej odpowiedzi pomogły mi ogolić kilka bajtów w powyższym rozwiązaniu

Albert Renshaw
źródło
1
Udało mi się osiągnąć 68 lat, byłem z siebie bardzo dumny ... a potem przewinąłem :( - Dobra robota!
Quentin
1
Bardzo dobrze! Zdobądź +1
Steadybox
Mam 2*ntam dwa razy i przeszkadza mi to, czy ktoś może wymyślić sprytny sposób, aby jakoś to skrócić?
Albert Renshaw,
7

JavaScript (ES6), 97 85 81 75 74 bajtów

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

Okazuje się, że nie użyłem prawie wystarczającej rekurencji

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

Jan
źródło
6

05AB1E , 16 15 16 bajtów

Oszczędność bajtu dzięki Adnanowi

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

Wypróbuj online!

Wyjaśnienie

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
Emigna
źródło
ð×.svy¦…|ÿ\}¹>'-×», zgaduję, że mój pomysł .snie był tak dobry, jak myślałem. Fajne zastosowanie ÿ, nie widziałem tego wcześniej.
Magic Octopus Urn
@carusocomputing: Zastanawiałem się nad .stym, zaczynając od, <Ýð×ale wpadłem w kłopoty ze specjalnym przypadkiem z tymi metodami.
Emigna
FðN×…|ÿ\}Dg'-×»na 15 bajtów
Adnan
@Adnan: Niezły chwyt Dg! Dzięki :)
Emigna
.sspowodowało także zagnieżdżenie tablic i spłaszczenie, które wymagało więcej bajtów.
Magic Octopus Urn
5

V , 18 17 16 bajtów

1 bajt zapisany dzięki @ nmjcman101 za użycie innego sposobu wyprowadzania niczego, jeśli wejście jest 0

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

Wypróbuj online!

Hexdump:

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

Wyjaśnienie (nieaktualne)

Najpierw mamy pętlę, aby sprawdzić, czy argument jest 0. Jeśli tak, poniższy kod wykonuje się ( |\jest zapisywany). W przeciwnym razie nic nie zostanie zapisane, a bufor będzie pusty.

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

Teraz, gdy mamy szczyt trójkąta, musimy stworzyć jego ciało.

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

Teraz mamy jedną dodatkową linię na dole bufora. Musi to zostać zastąpione przez -s.

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

Ta odpowiedź byłaby krótsza, gdybyśmy mogli uzyskać cokolwiek, co chcemy 0

V , 14 13 bajtów

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

Wypróbuj online!

Kritixi Lithos
źródło
Nie powinienem był tak bardzo się starać na bajt Wypróbuj online!
nmjcman101
@ nmjcman101 Ah, «oczywiście. Sprytny! :)
Kritixi Lithos
4

C #, 93 bajty

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

Anonimowa funkcja zwracająca trójkąt ASCII jako ciąg znaków.

Pełny program z nieoznaczoną, komentowaną funkcją i przypadkami testowymi:

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));
    }
}
adrianmp
źródło
3

Python 2 , 69 bajtów

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

Wypróbuj online!

Pręt
źródło
Jeśli go drukujesz, możesz zaoszczędzić kilka bajtów, zmieniając na python3, usuwając "".joini zastępując go *operatorem oraz separgumentem funkcji uśpienia, więclambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp
3

CJam , 24 22 21 bajtów

Zaoszczędzono 1 bajt dzięki Martinowi Enderowi

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

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
2

SmileBASIC, 51 bajtów

INPUT N
FOR I=0TO N-1?"|";" "*I;"\
NEXT?"-"*(N+!!N)
12Me21
źródło
2

PowerShell , 51 67 bajtów

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

Wypróbuj online!

(Zwiększenie bajtu, aby uwzględnić brak nowej linii)

Pobiera dane wejściowe $ni sprawdza, czy nie jest to zero. Następnie zapętlić, aby zbudować trójkąt, i kończy się linią -. Ujawnienie Write-Outputnastępuje po zakończeniu programu.

AdmBorkBork
źródło
Program drukuje końcowy znak nowej linii, ale poprosiłem, aby wynik był dokładnie taki, jak określono, przepraszam!
Okx
@Okx Zmieniono kosztem 16 bajtów.
AdmBorkBork
2

Siatkówka , 39 bajtów

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

Wypróbuj online

Konwertuj dane dziesiętne na unary. Zamień każdy 1z nich |<N-1 spaces>\¶, wydrukuj i cofnij zamianę. Zastąp każdy 1łącznikiem, a ostatni łącznik 2 łącznikami. Tadaa!

mbomb007
źródło
2

Common Lisp, 89 86 bajtów

Tworzy anonimową funkcję, która pobiera dane wejściowe n i drukuje trójkąt do *standard-output*(domyślnie standardowe wyjście).

Grał w golfa

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

Bez golfa

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

Jestem pewien, że mógłbym to jakoś skrócić.

djeis
źródło
2

C 101 93 75 bajtów

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

Wersja bez golfa

void f(int n)
{
  int i;

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

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

}

@Steadybox Dzięki za wskazanie, ma wiele sensu.

Abel Tom
źródło
1
Możesz ogolić kilka bajtów, zastępując stałe znaków ich wartością ASCII i przenosząc pierwszy i ++ w treści pętli. I dlaczego jest printf("%c",'_');tak gadatliwy?
Jens
@Jens stimmt, Danke sehr :) Zaktualizowano
Abel Tom
Można to zmniejszyć do 74 bajtów:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox
Do 69 bajtów, w rzeczywistości:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox
@ Steadybox 68: n--+1można skrócić do~n--
Albert Renshaw
2

Węgiel drzewny , 15 bajtów

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

Wypróbuj online!

Awaria

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
Mike Bufardeci
źródło
Bardzo późny komentarz, ale zamknięcie »można pominąć.
DLosc
2

Japt , 20 bajtów

Zaoszczędź 2 bajty dzięki @ETHproductions

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

Wypróbuj online!

Wyjaśnienie

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
Oliver
źródło
1
Niezłe! Można zapisać bajt popychając ostatni wiersz przed dołączeniem: o@'|+SpX +'\Ãp'-pUÄ)·z powodu błędu (naprawdę niezamierzony efekt uboczny automatycznych funkcji), można następnie usunąć 'w '-.
ETHproductions
W rzeczywistości jest tak ze wszystkimi małymi literami, nie tylko p. Dzięki temu możesz np. m*2mp2
Podwoić
2

J, 20 bajtów

-13 bajtów dzięki Bob

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

Wypróbuj online!

oryginał: 33 bajty

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

bez golfa

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

Wypróbuj online!

Jonasz
źródło
25 bajtów z*,&'-' '|',.'\'{."0~_1-i.
mil
22 bajty z*,&'-' '|',.' \'{~=@i.
bob
@ bob To było bardzo sprytne w użyciu matrycy tożsamości
mile
@bob dzięki za sugestię. zaktualizowałem post
Jonasz
1

Python2, 73 bajty

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

Pełny program. Próbowałem także interpolacji ciągów dla ostatniego wiersza, ale okazało się, że jest on o kilka bajtów dłuższy: /

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

Inne rozwiązanie przy 73 bajtach:

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

Przypadki testowe

0:

1:
|\
--

2:
|\
| \
---

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

6:
|\
| \
|  \
|   \
|    \
|     \
-------
Yytsi
źródło
Przepraszam za mój poprzedni komentarz, funkcje są teraz dozwolone.
Okx
@Okx Nie ma problemu. Jest to pełny program. Nie sądzę, że przyjrzę się modom rozwiązania funkcyjnego :)
Yytsi
1

MATL , 19 bajtów

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

Wypróbuj online!

?         % 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
Luis Mendo
źródło
1

QBIC , 41 bajtów

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

Wyjaśnienie

:~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.
Steenbergh
źródło
1

R, 101 bajtów

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

Ten kod jest zgodny z przypadkiem n=0testowym, jeśli tylko wziąć pod uwagę STDOUT!
Rzeczywiście, stopifnot(n>0)część zatrzymuje wykonywanie skryptu, wyświetla tylko STDOUTzapisyError: n > 0 is not TRUE do SDTERR.

Nie golfowany:

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

cat("-", rep("-", n), sep = "")
Frédéric
źródło
1
Może chcesz poprawić pisownię nieprzygotowanego golfa
fəˈnɛtɪk
1

Python 2 , 62 bajty

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

Wypróbuj online!

Drukuje wiersz po wierszu, za każdym razem dodając kolejne spacje przed odwrotnym ukośnikiem. Jeśli funkcja, która nie drukuje, byłaby dozwolona, ​​prawdopodobnie byłaby krótsza.

xnor
źródło
Najwyraźniej funkcje nie muszą być drukowane.
Yytsi
1

JavaScript (ES6), 71 bajtów

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!>

Wyjścia do konsoli. Zaoszczędź 6 bajtów, jeśli drukowanie w powłoce JavaScript SpiderMonkey jest dopuszczalne. Zapisz 13 bajtów, jeśli zwracanie danych wyjściowych jest dopuszczalne.

Neil
źródło
To wyrażenie jest genialne. Najpierw spróbowałem czegoś podobnego. Nie wiem o tym $`wzorze, ale nie wiem, czy nadal bym o nim pomyślał. Miły.
stycznia
1

Python 2 , 67 bajtów

Kolejna funkcja w Pythonie 2 przy użyciu rjust.

lambda n:('|'.join(map('\\\n'.rjust,range(n+2)))+'-'*-~n)[4:]*(n>0)

Wypróbuj online!

PidgeyUsedGust
źródło
1

Python 3 , 60 bajtów

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

Wypróbuj online!

Dwa kolejne rozwiązania z tą samą liczbą bajtów.

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+' ')
Dennis
źródło
1

Perl, 63 bytes

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

Ungolfed:

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

$" is the list separator, which defaults to " ". $/ is the output record separator, which defaults to "\n". $_ is the implicit loop variable.

Andy Lester
źródło
1
probably could save some by reading the input off of stdin?$n=<>?
Ven
1

Haskell, 82 65 bytes

g 0=""
g n=((take n$iterate(' ':)"\\\n")>>=('|':))++([0..n]>>"-")

Try it online! Usage:

Prelude> g 4
"|\\\n| \\\n|  \\\n|   \\\n-----"

Or more nicely:

Prelude> putStr $ g 4
|\
| \
|  \
|   \
-----
Laikoni
źródło
1

Pyth, 23 18 bytes

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

Test suite available online.
Thanks to Ven for golfing off 5 bytes.

Explanation

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
Mike Bufardeci
źródło
@Ven Thanks! You can cut off the last | for an additional byte.
Mike Bufardeci
0

Javascript 101(Full Program), 94(Function Output), 79(Return) bytes

Full Program

Will not run in Chrome (as process doesn't exist apparently)
Will not run in TIO (as prompt apparently isn't allowed)

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

Function with EXACT print

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

Try it Online

Function with return string

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

Try it Online

Repeating characters in Javascript is dumb and so is suppressing newlines on output

fəˈnɛtɪk
źródło
0

Python 2, 82 bytes

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

Try it online!

Longer that the other Python answers but a recursive function just to be different.

It feels wasteful using two print statements but I can't find a shorter way round it. Also the exit() wastes 7 to stop it printing decreasing number of - under the triangle.

ElPedro
źródło
You can do -~c*(c>0) on the last line to save 3 bytes :)
Yytsi
Or better yet: c and-~c.
Yytsi