ASCII-Dreiecke

30

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die ein ASCII-Dreieck druckt. Sie sehen so aus:

|\
| \
|  \
----

Ihr Programm nimmt eine einzelne numerische Eingabe nmit den Einschränkungen an 0 <= n <= 1000. Das obige Dreieck hatte einen Wert von n=3.

Das ASCII-Dreieck hat nBackslashes ( \) und vertikale Striche ( |), n+1Linien und Bindestriche ( -) und jede Linie hat eine Anzahl von Leerzeichen, die der Zeilennummer (0-basiert, dh die erste Linie ist die Linie 0) neben der letzten Linie entsprechen .

Beispiele:

Eingang:

4

Ausgabe:

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

Eingang:

0

Ausgabe:


In diesem Testfall muss die Ausgabe leer sein. Kein Leerzeichen.

Eingang:

1

Ausgabe:

|\
--

Input & Output muss genau so sein , wie ich es angegeben habe.

Dies ist , also streben Sie den kürzesten möglichen Code an!

Okx
quelle
4
Muss es ein Programm sein oder kann es eine Funktion sein?
8.
7
Ich denke, es wäre besser, wenn case 0eine unerwartete Ausgabe haben kann, da es sich um einen
Kantenfall handelt
4
@Okx Es gibt häufig Fragen, bei denen der Fragesteller Programm sagt, aber wirklich Programm oder Funktion meint. Vielleicht möchten Sie klarstellen, dass Sie nach einem vollständigen Programm
fragen
9
Ich würde auf jeden Fall für Programm und Funktion gehen. Dies ist die Standardregel, wenn nichts anderes angegeben ist. Ich würde auch den 0-Kanten-Fall entfernen, da er eine direkte Verletzung von " n + 1 Zeilen und Strichen (-) " darstellt.
Stewie Griffin
3
Ohne die Ausnahme size = 0 wäre die Herausforderung zu einfach. Ein Teil der Herausforderung besteht darin, einen Weg zu finden, um dies mit der geringsten Menge an zusätzlichem Code zu berücksichtigen.
12. Mai,

Antworten:

3

Jelly , 14 Bytes

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

Probieren Sie es online!

Wie es funktioniert.

’⁶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
quelle
11

C 58 Bytes

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

-

Dank @Steadybox, dessen Kommentare zu dieser Antwort mir geholfen haben, ein paar Bytes in meiner obigen Lösung zu rasieren

Albert Renshaw
quelle
1
Ich habe es geschafft, 68 zu erreichen, war ziemlich stolz auf mich .. und dann habe ich gescrollt :( - Gut gemacht!
Quentin
1
Sehr schön! Habe eine +1
Steadybox
Ich habe 2*nzweimal drin und es stört mich, kann mir jemand eine clevere Möglichkeit vorstellen, es irgendwie zu verkürzen?
Albert Renshaw
7

Javascript (ES6), 97 85 81 75 74 Bytes

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

Es stellte sich heraus, dass ich fast nicht genug Rekursion verwendet habe

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
quelle
6

05AB1E , 16 15 16 Bytes

Ein Byte dank Adnan gespeichert

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

Probieren Sie es online!

Erläuterung

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
quelle
ð×.svy¦…|ÿ\}¹>'-×».sIch schätze, meine Vorstellung von war nicht so gut, wie ich dachte. Gute Verwendung von ÿ, habe das noch nie gesehen.
Magic Octopus Urn
@carusocomputing: Ich dachte .sauch darüber nach, als ich anfing, bekam <Ýð×aber Probleme mit dem Sonderfall mit diesen Methoden.
Emigna
FðN×…|ÿ\}Dg'-×»für 15 Bytes
Adnan
@Adnan: Schöner Fang mit Dg! Danke :)
Emigna
.sDies führte auch zu verschachtelten Arrays und einer Reduzierung, die mehr Bytes erforderte.
Magic Octopus Urn
5

V , 18 17 16 Bytes

1 Byte gespart dank @ nmjcman101 für die Verwendung einer anderen Methode zur Ausgabe von nichts, wenn die Eingabe ist 0

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

Probieren Sie es online!

Hexdump:

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

Erklärung (veraltet)

Wir haben zuerst eine Schleife, um zu überprüfen, ob das Argument ist 0. In diesem Fall wird der folgende Code ausgeführt ( |\geschrieben). Ansonsten wird nichts geschrieben und der Puffer ist leer.

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

Nachdem wir das obere Ende des Dreiecks erreicht haben, müssen wir seinen Körper erstellen.

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

Jetzt haben wir eine zusätzliche Zeile am unteren Rand des Puffers. Dies muss durch -s ersetzt werden.

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

Diese Antwort wäre kürzer, wenn wir alles eingeben könnten, was wir wollen 0

V , 14 13 Bytes

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

Probieren Sie es online!

Kritixi Lithos
quelle
Ich hätte es für ein Byte nicht so sehr versuchen sollen. Probieren Sie es online aus!
nmjcman101
@ nmjcman101 Ah, «natürlich. Klug! :)
Kritixi Lithos
4

C # 93 Bytes

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

Anonyme Funktion, die das ASCII-Dreieck als Zeichenfolge zurückgibt.

Volles Programm mit ungolfed, kommentierten Funktionen und Testfällen:

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
quelle
3

Python 2 , 69 Bytes

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

Probieren Sie es online!

Stange
quelle
Wenn Sie es drucken, können Sie durch die Umstellung auf python3 ein paar Bytes zu speichern, zu entfernen "".joinund es mit dem Austausch *Bediener und dem sepArgument in der Sleep - Funktion, solambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp
3

CJam , 24 22 21 Bytes

Dank Martin Ender 1 Byte gespeichert

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

Probieren Sie es online!

Erläuterung

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
Geschäfts-Katze
quelle
2

SmileBASIC, 51 Bytes

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

PowerShell , 51 bis 67 Byte

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

Probieren Sie es online!

(Byteerhöhung, um keinen nachgestellten Zeilenumbruch zu berücksichtigen)

Nimmt Eingaben entgegen $nund überprüft, ob sie ungleich Null sind. Dann werden Schleifen erstellt, um das Dreieck zu konstruieren, und mit einer Linie aus -. Implizit Write-Outputerfolgt bei Programmabschluss.

AdmBorkBork
quelle
Das Programm gibt eine nachgestellte Zeile aus, aber ich habe die Ausgabe genau so angefordert, wie sie angegeben wurde. Entschuldigung!
Okx
@Okx Geändert zu einem Preis von 16 Bytes.
AdmBorkBork
2

Netzhaut , 39 Bytes

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

Probieren Sie es online aus

Konvertiert die Dezimaleingabe in eine unäre. Ersetzen Sie jedes 1durch |<N-1 spaces>\¶, drucken Sie und machen Sie das Ersetzen rückgängig. Ersetzen Sie jeden 1durch einen Bindestrich und den letzten durch 2 Bindestriche. Tadaa!

mbomb007
quelle
2

Gemeines Lisp, 89 86 Bytes

Erstellt eine anonyme Funktion, die die Eingabe n verwendet und das Dreieck nach *standard-output*(standardmäßig stdout) druckt .

Golf gespielt

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

Ungolfed

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

Ich bin sicher, ich könnte das irgendwie kürzer machen.

djeis
quelle
2

C 101 93 75 Bytes

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

Ungolfed-Version

void f(int n)
{
  int i;

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

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

}

@Steadybox Danke für den Hinweis, macht viel Sinn.

Abel Tom
quelle
1
Sie können einige Bytes sparen, indem Sie die Zeichenkonstanten durch ihren ASCII-Wert ersetzen und das erste i ++ im Schleifenkörper verschieben. Und warum ist printf("%c",'_');so wortreich?
Jens
@Jens stimmt, Danke sehr :) Aktualisiert
Abel Tom
Dies kann auf 74 Bytes i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
reduziert werden
Um 69 Bytes, eigentlich:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox
@Steadybox 68: n--+1kann verkürzt werden auf~n--
Albert Renshaw
2

Kohle , 15 Bytes

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

Probieren Sie es online!

Nervenzusammenbruch

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
quelle
Sehr später Kommentar, aber das Schließen »kann weggelassen werden.
DLosc
2

Japt , 20 Bytes

2 Bytes gespart dank @ETHproductions

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

Probieren Sie es online!

Erläuterung

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
quelle
1
Schön! Sie können , bevor er die letzte Zeile durch Drücken eines Byte speichern: o@'|+SpX +'\Ãp'-pUÄ)·und aufgrund eines Fehlers (wirklich eine unbeabsichtigte Nebenwirkung der Auto-Funktionen) können Sie dann entfernen Sie die 'in '-.
ETHproductions
Eigentlich ist es so mit allen Kleinbuchstaben, nicht nur p. Das ist , so dass Sie tun können , zB m*2jedes Element zu verdoppeln, oder mp2jeden quadratisch
ETHproductions
2

J, 20 Bytes

-13 bytes dank bob

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

Probieren Sie es online!

Original: 33 Bytes

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

ungolfed

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

Probieren Sie es online!

Jona
quelle
25 Bytes mit*,&'-' '|',.'\'{."0~_1-i.
Meilen
22 Bytes mit*,&'-' '|',.' \'{~=@i.
Bob
@bob Das war sehr klug, Identitätsmatrix zu verwenden
Meilen
@ Bob danke für den Vorschlag. Ich habe den Beitrag aktualisiert
Jonah
1

Python2, 73 Bytes

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

Ein volles Programm. Ich habe auch versucht, Zeichenfolgen für die letzte Zeile zu interpolieren, aber es hat sich herausgestellt, dass sie ein paar Bytes länger ist: /

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

Eine andere Lösung bei 73 Bytes:

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

Testfälle

0:

1:
|\
--

2:
|\
| \
---

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

6:
|\
| \
|  \
|   \
|    \
|     \
-------
Yytsi
quelle
Ich entschuldige mich für meinen vorherigen Kommentar, Funktionen sind jetzt erlaubt.
Okx
@Okx Kein Problem. Dies steht als volles Programm. Ich glaube nicht, dass ich mich mit der Mode einer Funktionslösung
befassen werde
1

MATL , 19 Bytes

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

Probieren Sie es 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
quelle
1

QBIC , 41 Bytes

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

Erläuterung

:~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
quelle
1

R 101 Bytes

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

Dieser Code entspricht dem n=0Testfall, wenn Sie nur berücksichtigen STDOUT!
Tatsächlich ist die stopifnot(n>0)Anschläge Teil der Skriptausführung, zeigt nichts an , STDOUTsondern schreibt Error: n > 0 is not TRUEan SDTERR.

Ungolfed:

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

cat("-", rep("-", n), sep = "")
Frédéric
quelle
1
Möglicherweise möchten Sie die Schreibweise von ungolfed
fəˈnəˈtɪk
1

Python 2 , 62 Bytes

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

Probieren Sie es online!

Druckt zeilenweise, wobei vor dem Backslash jeweils ein Leerzeichen eingefügt wird. Wenn eine Funktion zulässig wäre, die nicht gedruckt wird, wäre dies wahrscheinlich kürzer.

xnor
quelle
Anscheinend müssen Funktionen nicht drucken.
Yytsi
1

JavaScript (ES6), 71 Byte

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

Ausgänge zur Konsole. Sparen Sie 6 Byte, wenn das Drucken in der SpiderMonkey-JavaScript-Shell zulässig ist. Sparen Sie 13 Bytes, wenn die Ausgabe akzeptabel ist.

Neil
quelle
Dieser Regex ist genial. Ich habe zuerst etwas in diese Richtung versucht. Ich weiß nichts über das $`Muster, aber ich weiß nicht, ob ich noch daran gedacht hätte. Nett.
Jan
1

Python 3 , 60 Bytes

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

Probieren Sie es online!

Zwei weitere Lösungen mit derselben Byteanzahl.

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
quelle
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;

$"ist das Listentrennzeichen, das standardmäßig "" lautet. $/ist das Trennzeichen für Ausgabedatensätze, das standardmäßig "\ n" ist. $_ist die implizite Schleifenvariable.

Andy Lester
quelle
1
könnte man wohl etwas sparen, indem man die eingabe von stdin ausliest? $n=<>?
Ven
1

Haskell , 82 65 Bytes

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

Probieren Sie es online! Verwendung:

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

Oder schöner:

Prelude> putStr $ g 4
|\
| \
|  \
|   \
-----
Laikoni
quelle
1

Pyth, 23 18 Bytes

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

Testsuite online verfügbar.
Vielen Dank an Ven für das Abschlagen von 5 Bytes.

Erläuterung

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
quelle
@Ven Danke! Sie können das letzte |für ein zusätzliches Byte abschneiden .
Mike Bufardeci
0

Javascript 101 (Vollprogramm), 94 (Funktionsausgabe), 79 (Rückgabe) Bytes

Volles Programm

Läuft nicht in Chrome (da Prozess anscheinend nicht existiert)
Läuft nicht in TIO (da Eingabeaufforderung anscheinend nicht erlaubt ist)

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

Funktionieren Sie mit EXACT-Druck

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

Probieren Sie es online

Funktion mit Return-String

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

Probieren Sie es online

Das Wiederholen von Zeichen in Javascript ist dumm, ebenso wie das Unterdrücken von Zeilenumbrüchen bei der Ausgabe

fəˈnəˈtɪk
quelle
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()

Probieren Sie es online!

Länger als der andere Python antwortet aber eine rekursive Funktion nur um anders zu sein.

Es fühlt sich verschwenderisch an, zwei printAussagen zu verwenden, aber ich kann keinen kürzeren Weg finden, um es zu umgehen. Auch die exit()Verschwendung 7, um das Drucken zu stoppen, verringert die Anzahl -unter dem Dreieck.

ElPedro
quelle
Sie können -~c*(c>0)in der letzten Zeile 3 Bytes speichern :)
Yytsi
Oder noch besser: c and-~c.
Yytsi