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!

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

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


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


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

ð×.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!


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

3

Python 2 , 69 Bytes

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

Probieren Sie es online!


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

2

SmileBASIC, 51 Bytes

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

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.


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!


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.


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.


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

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

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!


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

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

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.

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

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.


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.


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

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.


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

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

@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


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.


Sie können -~c*(c>0)in der letzten Zeile 3 Bytes speichern :)
Yytsi

Oder noch besser: c and-~c.
Yytsi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.