Einrücken einer Zeichenfolge in Klammern

16

Vorausgesetzt, die folgenden Eingaben in das Programm:

  1. Liste der Blockstartzeichen
  2. Liste der Blockendezeichen
  3. Eine zu formatierende Zeichenfolge

Formatieren Sie die Zeichenfolge mit den Blöcken, die durch die beiden eingerückten Zeichensätze begrenzt sind.

Die Formatierung erfolgt mit zwei Leerzeichen pro Ebene, und die Klammern werden wie im folgenden Beispiel dargestellt gesetzt. Sie können davon ausgehen, dass die Sätze der öffnenden und schließenden Zeichen nicht zusammenfallen.

ZB für {[(<und }])>als öffnende und schließende Zeichensätze und folgende Zeichenfolge:

abc{xyz{text[note{comment(t{ex}t)abc}]}}

Folgende Ausgabe wird erwartet:

abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}

Sie dürfen die Liste der Zeichen in Klammern nicht hart codieren. Wie die Eingabe erfolgt, ist jedoch nicht festgelegt. Dies können entweder Befehlszeilenargumente oder Standardeingaben sein.

Prashant Bhate
quelle
5
Können wir davon ausgehen, dass es für jede Klammer eine abschließende Klammer in derselben Reihenfolge gibt?
Juan
Muss das Programm Klammerzeichen als Argumente unterstützen? zB ./program 'p' 'q' <<< '1p23p45q67q8' Oder braucht es nur Unterstützung {[(<und }])>?
Joey Adams
@Joey, ich würde nicht davon ausgehen, obwohl das umso beeindruckender wäre.
Neil
joey: Eingabe sind 1. offene Klammerzeichen 2. schließende Klammerzeichen 3. einzurückende Zeichenfolge. Juan: Wir können davon ausgehen, dass, obwohl sich der Code nicht darauf verlassen muss, das Delim Teil des Öffnens von Klammerzeichen ist, der Einzug vergrößert wird, andernfalls, wenn ein Teil des Schließens von Klammerzeichen den Einzug verkleinert wird.
Prashant Bhate
1
@Phrasant Bhate: Und in der Ausgabe?
Lowjacker

Antworten:

6

Ruby, 106 101 96 95

s,e,i=$*
i.scan(/[#{z=Regexp.quote s+e}]|[^#{z}]*/){|l|puts'  '*(s[l]?~-$.+=1:e[l]?$.-=1:$.)+l}

Die Eingabe erfolgt über die Kommandozeile.

Lowjacker
quelle
1
Sie können 4 Zeichen speichern, indem Sie ~-j+=1anstelle von verwenden (j+=1;j-1). Außerdem können Sie durch Verwenden von $.Überall anstelle von jdie entfernen j=0, wodurch ein anderes Zeichen gespeichert wird.
Ventero
6

Perl - 131 96 94 Zeichen

$i="";for$_(split/([\Q$ARGV[0]$ARGV[1]\E])/,$ARGV[2]){$i=~s/..// if/[\Q$ARGV[1]\E]/;print "$i$_\n"if$_;$i.='  'if/[\Q$ARGV[0]\E]/;}

Zumindest scheint es Raum zu geben, um gängige Ausdrücke zu eliminieren, aber es ist eine kurze Darstellung, die das Beispiel behandelt, sowie Joey Adams 'Hypothese über beliebige Klammern.


Es gab in der Tat viel Raum für Verbesserungen:

$_=pop;($s,$e)=map"[\Q$_\E]",@ARGV;for(split/($s|$e)/){print"  "x($i-=/$e/),"$_\n"if$_;$i+=/$s/}

... und noch ein bisschen mehr:

$_=pop;($s,$e)=map"[\Q$_\E]",@ARGV;map{print"  "x($i-=/$e/),"$_\n"if$_;$i+=/$s/}split/($s|$e)/
DCharness
quelle
3

Mathematica (nicht Code Golf)

indent[str_String]:=Module[{ind,indent,f},
ind=0;
indent[i_]:="\n"<>Nest["    "<>ToString[#]&,"",i];
f[c_] :=  (indent[ind] <> c <> indent[++ind]) /; StringMatchQ["[({",___~~c~~___];
f[c_] := ( indent[--ind] <> c <>indent[ind])  /; StringMatchQ["])}",___~~c~~___];
f[c_] := (c <>indent[ind])       /; StringMatchQ[";,",___~~c~~___];
f[c_] := c  ;
f /@ Characters@ str//StringJoin
]

Prüfung

indent["abc{xyz{text[note{comment(t{ex}t)abc}]}}"]
abc
{
    xyz
    {
        text
        [
            note
            {
                comment
                (
                    t
                    {
                        ex
                    }
                    t
                )
                abc
            }

        ]

    }

}

Als Bonus kann die folgende Funktion verwendet werden, um mathematische Ausdrücke zu formatieren

format[expr_] := indent[expr // FullForm // ToString]

EDIT (Nicht-Code-Golf) Aktualisiert mit feiner granularer Kontrolle über die Art und Weise, wie Zeilenumbrüche gerendert werden

indent[str_String, ob_String, cb_String, delim_String] := 
  Module[{ind, indent, f, tab}, ind = 0; tab = "    ";
   indent[i_, tab_, nl_] := nl <> Nest[tab <> ToString[#] &, "", i];
   f[c_] := (indent[ind, "", " "] <> c <> indent[++ind, tab, "\n"]) /;StringMatchQ[ob, ___ ~~ c ~~ ___];
   f[c_] := (indent[--ind, "", " "] <> c <> indent[ind, tab, "\n"]) /;StringMatchQ[cb, ___ ~~ c ~~ ___];
   f[c_] := (c <> indent[ind, tab, "\n"]) /;StringMatchQ[delim, ___ ~~ c ~~ ___];
   f[c_] := c;
   f /@ Characters@str // StringJoin];
format[expr_] := indent[expr // InputForm // ToString, "[({", "])}", ";"];

format[Hold@Module[{ind, indent, f, tab}, ind = 0; tab = "    ";
 indent[i_, tab_, nl_] := nl <> Nest[tab <> ToString[#] &, "", i];
 f[c_] := (indent[ind, "", " "] <> c <> indent[++ind, tab, "\n"]) /;StringMatchQ[ob, ___ ~~ c ~~ ___];
 f[c_] := (indent[--ind, "", " "] <> c <> indent[ind, tab, "\n"]) /;StringMatchQ[cb, ___ ~~ c ~~ ___];
 f[c_] := (c <> indent[ind, tab, "\n"]) /;StringMatchQ[delim, ___ ~~ c ~~ ___];
 f[c_] := c;
 f /@ Characters@str // StringJoin]]

Ausgabe

Hold [
    Module [
         {
            ind, indent, f, tab }
        , ind = 0;
         tab = "    ";
         indent [
            i_, tab_, nl_ ]
         := StringJoin [
            nl, Nest [
                StringJoin [
                    tab, ToString [
                        #1 ]
                     ]
                 & , "", i ]
             ]
        ;
         f [
            c_ ]
         := StringJoin [
            indent [
                ind, "", " " ]
            , c, indent [
                ++ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            ob, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := StringJoin [
            indent [
                --ind, "", " " ]
            , c, indent [
                ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            cb, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := StringJoin [
            c, indent [
                ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            delim, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := c;
         StringJoin [
            f / @
                 Characters [
                    str ]
                 ]
             ]
         ]
Prashant Bhate
quelle
Das ist kaum Codegolf, mit mehrstelligen Namen wie indent. Ist Ihr Ziel maximal knapper Code oder Lesbarkeit? Es gibt eine Reihe von Möglichkeiten, diesen Code zu verkürzen, wenn dies tatsächlich Ihr Ziel ist. Außerdem: "Sie dürfen die Liste der Zeichen in Klammern nicht hart codieren." doch ist das nicht genau das, was du hier getan hast? Wie auch immer, es tut mir leid, so negativ zu klingen. Es erscheint mir nur als seltsame Antwort auf Ihre eigene Herausforderung.
Mr.Wizard
1
@ Mr.Wizard es ist kein Code Golf, ich habe es für meine eigene Referenz hinzugefügt [aktualisiert, um es klar zu machen]. Ich verwende es häufig, um unformatierten Mathematica-Code zu verstehen, der mehr als eine Seite umfasst
Prashant Bhate,
3

JavaScript, 255 227 205 Zeichen

Hey, seine Länge passt perfekt in ein Byte! : D

function(s,e,t){R=eval.bind(0,"Array(n).join(' ')");for(i=n=0,b=r='';c=t[i++];)~s.indexOf(c)?(r+=b,b='\n'+R(++n)+c+'\n '+R(++n)):~e.indexOf(c)?b+='\n'+((n-=2)?R()+' ':'')+c+'\n'+(n?R()+' ':''):b+=c;return r+b}

Es ist eine Funktion, übergebe ihr die Startzeichen, die Endzeichen und dann den Text.

Ry-
quelle
Ihr eigener Bearbeitungskommentar wurde gegen Sie verwendet. : D
Türknauf
@Doorknob: Ich ... ich dachte, ich hätte das nie getan. D: Es tut mir so leid. (Waren Sie auf der Jagd?)
Ry
@Doorknob: Und danke, dass du mich daran erinnert hast; verkürzt :)
Ry-
Nein , ich war nicht der Jagd, stolperte über diese Frage, aber ich beschlossen, und ich fand dieses : O: P
Doorknob
2

Python - 162 Zeichen

i=f=0
s=""
l,r,z=[raw_input()for c in'   ']
o=lambda:s+("\n"+"  "*i)*f+c
for c in z:
 if c in l:f=1;s=o();i+=1
 elif c in r:i-=1;f=1;s=o()
 else:s=o();f=0
print s
Juan
quelle
Beachten Sie, dass die Aufgabe erfordert, dass die beiden Sätze von Klammern Teil der Eingabe sind und nicht fest codiert sind.
Joey
@ Joey bemerkt, ich werde das in einer Weile beheben. Vielen Dank
Juan
2

Python 2.7.X - 136 Zeichen

import sys
a,c=sys.argv,0
for i in a[3]:
 if not(i in a[2]):print ' '*c+i
 else:print ' '*(c-4)+i
 if i in a[1]:c+=4
 if i in a[2]:c-=4

Verwendung : $ ./foo.py '(' ')' '(ab (cd (ef) gh) ij)'

Resultierende Ausgabe:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)
arrdem
quelle
Benötigen Sie die Leerzeichen nach den printAnweisungen?
Zacharý
2

C - 213 209

Ich hasse dumme Fehler ...>. <

#include<stdio.h>
#include<string.h>
int main(int i,char**s){for(char q,r,c,t,a=0;~(c=getchar());t=q|r){q=!!strchr(s[1],c);a-=r=!!strchr(s[2],c);for(i=0;t|q|r&&i<2*a+1;putchar(i++?' ':'\n'));a+=q;putchar(c);}}

Liest left-parens aus dem ersten Befehlszeilenargument, right-parens aus dem zweiten Argument und rückt stdin ein.

Hübsch gedruckt und kommentiert:

int main(int i, char **s) {
  for (char q, r, /* is left-paren? is right-paren? */
            c,    /* character read from input */
            t,    /* last char was a paren-char */
            a=0;  /* indentation */
       ~(c = getchar());
       t = q|r) {
         q = !!strchr(s[1],c);
    a -= r = !!strchr(s[2],c);
    for (i=0; t|q|r && i<2*a+1; putchar(i++? ' ' : '\n'));
    a += q;
    putchar(c);
  }
}
FireFly
quelle
1

C ( 159 225 Zeichen)

#define q(s,c)strchr(s,c)
#define p(i,j,k)printf("\n%*s%c%c%*s",i,"",*s,k,j,"")
g(char*b,char*e,char*s){int i;for(i=0;*s;s++)q(b,*s)?p(i-2,i+=2,'\n'):q(e,*s)?q(b,*(s+1))||q(e,*(s+1))?p(i-=2,i-2,0):p(i-=2,i-2,'\n'):putchar(*s);}

Es hat mich 66 zusätzliche Zeichen gekostet, nur um den Fehler mit den leeren Zeilen zu beheben :( Ehrlich gesagt, ich brauche eine neue Herangehensweise, aber ich werde es vorerst einen Tag nennen.

#define p(i,j)printf("\n%*s%c\n%*s",i,"",*s,j,"")
f(char*b,char*e,char*s){int i;for(i=0;*s;s++){strchr(b,*s)?p(i-2,i+=2):strchr(e,*s)?p(i-=2,i-2):putchar(*s);}}

Ein ziemlich schneller und schmutziger Ansatz. Es hat den Fehler, Leerzeilen zwischen aufeinanderfolgenden schließenden Klammern zu erzeugen, aber sonst macht es den Job (oder so denke ich). Irgendwann in dieser Woche werde ich noch einmal darauf zurückgreifen, um eine bessere und sauberere Lösung zu finden.

char * b ist die öffnende Klammer, char * e die schließende Klammer und char * s die Eingabezeichenfolge.

Harry K.
quelle
1

Perl - 69 Bytes

TMTOWTDI vereinfacht den Code

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge
Hojung Youn
quelle
3
Sie sollten die Klammern als Eingabe verwenden und nicht fest codieren.
Gareth
1

Scala (2,9), 211 Zeichen

object P extends App{def x(j:Int)={"\n"+"  "*j}
var(i,n)=(0,"")
for(c<-args(2)){if(args(0).exists(_==c)){print(x(i)+c)
i+=1
n=x(i)}else{if(args(1).exists(_==c)){i-=1
print(x(i)+c)
n=x(i)}else{print(n+c)
n=""}}}}
Gareth
quelle
1

Perl - 89 85 Bytes

Eine Version von Hojung Youns Antwort, die die Blockzeichen über zwei Argumente akzeptiert.

#!perl -p
BEGIN{$b=pop;$a=pop}s/([$a])|([$b])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge

Genannt wie:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'
Sorpigal
quelle
Sehr schönes Konzept, @Hojung und Sorpigal. Es ist allerdings etwas zerbrechlich. Tauschen Sie beispielsweise die Zeichen] und} im Argument close-paren aus, und das] schließt die Zeichenklasse, was zu einem nicht übereinstimmenden Paren-Fehler führt. Angenommen, die offene Menge beginnt mit ^, vielleicht um v in der nahen Menge abzugleichen. Sie erhalten die Ergänzung der beabsichtigten Klasse [$ a]. Deshalb habe ich in meiner Antwort \ Q ... \ E verwendet. Das \ w + für nicht paren Zeichen funktioniert für das Beispiel, aber was ist mit Eingaben wie 'x (Foo-Bar) y' '(' ')'? Natürlich ist es nicht klar, dass der Code so etwas verarbeiten muss.
DCharness
1

Python3, 184 182 Zeichen

import sys
_,p,q,t=sys.argv
i,f,x=0,1,print
for e in t:
 if e in p:f or x();x(' '*i+e);i+=2;f=1
 elif e in q:f or x();i-=2;f=1;x(' '*i+e)
 else:not f or x(' '*i,end='');f=x(e,end='')

Beispiel:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
Alexandru
quelle
heinrich5991 schlug vor, zwei Zeichen zu speichern, indem die zweite Zeile auf "_,p,q,t=sys.argv
Peter Taylor
1

Groovy, 125

p=args;i=0;s={a,b->"\n"+"\t"*(b?i++:--i)+a+"\n"+"\t"*i};p[0].each{c->print p[1].contains(c)?s(c,1):p[2].contains(c)?s(c,0):c}

Sie können das Skript in einer Datei indent.groovy speichern und es mit folgendem Befehl ausprobieren:
groovy indent.groovy "abc {xyz {text [hinweis {kommentar (t {ex} t) abc}]}" "{[(" ") ]} "

Marco Martinelli
quelle
Ich habe es eine Stunde lang in Groovy versucht, bevor ich deine Antwort gesehen habe. Ich habe einen ähnlichen Ansatz gewählt, aber meiner ist viel länger als deiner, sodass ich nicht einmal die Mühe habe, etwas zu posten. Gute Arbeit! :)
Fels
1

Python - 407

from sys import*;o=argv[1];c=argv[2];t=argv[3];p=0;n=False;a=lambda:h not in e;b=lambda s:print(s+(" "*p)+h);r="";e=o+c
for h in t:
 for k in o:
  if h==k:
   if(r in e)and(r!=""):b("")
   else:b("\n")
   p+=2;n=True;break
 for k in c:
  if h==k:
   p-=2
   if(r in e)and(r!=""):b("")
   else:b("\n")
   n=True;break
 if a()and n:print((" "*p)+h,end="");n=False
 elif a():print(h,end="")
 r=h

Eine ungolfed Version des Programms:

import sys

open_set = sys.argv[1]
close_set = sys.argv[2]
text = sys.argv[3]
spaces = 0
newline = False
a = lambda : char not in b_set
b = lambda s: print(s + (" " * spaces) + char)
prev = ""
b_set = open_set + close_set

for char in text:
    for bracket in open_set:
        if char == bracket:
            if (prev in b_set) and (prev != ""):
                b("")
            else:
            b("\n")
        spaces += 2
        newline = True
        break
    for bracket in close_set:
        if char == bracket:
            spaces -= 2
            if (prev in b_set) and (prev != ""):
                b("")
            else:
                b("\n")
            newline = True
            break
    if a() and newline:
        print((" " * spaces) + char, end="")
        newline = False
    elif a():
        print(char, end="")
    prev = char

Die Argumente für das Programm lauten (in der angegebenen Reihenfolge): die öffnenden Klammern, die schließenden Klammern und der einzurückende Text.

Beispiel ($ ist die Eingabeaufforderung):

$ python indent.py "{[(<" "}])>" "abc{xyz{text[note{comment(t{ex}t)abc}]}}"
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
golfer9338
quelle
0

D (300)

C[] i(C,S)(ref S s,C p){if(!*s)return[];static C[] w;w~=" ";C[] r;C c=s[0];while(c!=p){s=s[1..$];r~=(c=='{'||c=='['||c=='<'?"\n"~w~c~"\n"~i(s,cast(char)(c+2)):c=='('?"\n"~w~c~"\n"~i(s,')'):[c]);c=*s;}w=w[1..$];if(*s)s=s[1..$];c=*s;return" "~w~r~"\n"~w~(c=='}'||c==']'||c=='>'||c==')'?[p]:p~"\n"~w);}

benötigt eine nullterminierte Zeichenkette für die Begrenzungsprüfung (ansonsten if(*s)muss die geändert werden in if(s.length))

Ratschenfreak
quelle
Beachten Sie, dass die Aufgabe erfordert, dass die beiden Sätze von Klammern Teil der Eingabe sind und nicht fest codiert sind.
Joey
0

Java

Non codegolf version! Angenommen, wir haben diese Version von split () , die delims enthält,

public static String indent(String input, String openPars,
        String closingPars) {
    String re = "["
            + (openPars + closingPars).replace("[", "\\[").replace("]",
                    "\\]") + "]";
    String[] split = inclusiveSplit(input, re, 0);
    int indent = 0;
    StringBuilder sb = new StringBuilder();
    for (String string : split) {
        if (StringUtils.isEmpty(string))
            continue;
        if (closingPars.indexOf(string) != -1) {
            indent--;
        }
        sb.append(StringUtils.repeat(" ", indent * 2));
                    sb.append(string);
                    sb.append("\n");
        if (openPars.indexOf(string) != -1) {
            indent++;
        }
    }
    String string = sb.toString();
    return string;
}
Prashant Bhate
quelle
2
StringUtilsist nicht Teil des Standard JDK.
st0le
0

C 284 Zeichen ohne Leerzeichen

Ich bin kein Fan von Verschleierung, aber gut ...

#include<cstdio>
#include<cstring>
#define g printf
#define j char
int main(int a,j**b){int c=0;for(j*f=b[3];*f!='\0';++f){if(strchr(b[1],*f)!=0){g("\n%*c\n%*c",c,*f,c+2,'\0');c+=2;}else if(strchr(b[2],*(f))!=0){c-=2;g("\n%*c",c,*f);if(strchr(b[2],*(f+1))==0)g("\n%*c",c,'\0');}else putchar(*f);}}

Verwendung: ./Programm start_brackets end_brackets string_to_parse

Mihai Bişog
quelle
0

php (187) (153)

function a($s,$o,$e){while(''!=$c=$s[$i++]){$a=strpbrk($c,$o)?2:0;$b=strpbrk($c,$e)?2:0;echo ($a+$b||$r)?"\n".str_pad('',$t-=$b):'',$c;$t+=$a;$r=$a+$b;}}

Die Funktion akzeptiert Zeichenfolgen, öffnende Begrenzer und endende Begrenzer als Argumente.

Migimaru
quelle
0

C 256

Parameter:

  • e ist das endzeichen,
  • n ist der Einzug,
  • b die öffnenden Klammern,
  • d die schließenden Klammern.

Ich habe den Code getrennt, um die horizontale Bildlaufleiste zu umgehen.

#define r char
#define P(c) putchar(c);
#define N P(x)
#define W printf("%*s",n,"");
r*s,x='\n';i(r e,int n,r*b,r*d){r*t=s,*p;int l=0;W while(*s!=e)    
{if(p=strchr(b,*s)){if(s!=t){N W}P(*s++)N i(d[p-b],n+2,b,d); N W 
P(*s++);l=1;}else{if(l){N W l=0;}P(*s++)}}}

Das vollständige Programm besteht aus 363 Zeichen.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define r char
#define P(c) putchar(c);
#define N P(x)
#define W printf("%*s",n,"");
r*s,x='\n';i(r e,int n,r*b,r*d)
{r*t=s,*p;int l=0;W while(*s!=e)
{if(p=strchr(b,*s)){if(s!=t){N W}
P(*s++)N i(d[p-b],n+2,b,d); N W
P(*s++);l=1;}else{if(l){N W l=0;}
P(*s++)}}}main(int c,r*v[]){s =
v[3];i('\0',0,v[1],v[2]);}
tkf
quelle
0

VB.net (? C)

Die Sprache eignet sich nicht zum Code-Golfen, daher habe ich einen ungewöhnlichen Ansatz gewählt. Verwenden eines Ablaufverfolgungslisteners zur Ausgabe an die Konsole.

Imports System.Diagnostics.Debug
Module Module1
  Sub Main(args() As String)
    IndentText(args(0), args(1), args(2)) 'openings, closings, text)
  End Sub
  Sub IndentText(o As String, e As String, t As String)
    Dim x = 0
    Listeners.Add(New Diagnostics.ConsoleTraceListener)
    IndentSize = 2
    For Each c In t
      If o.Contains(c) Then
        WriteLine("")
        WriteLine(c)
        Indent()
        x = 1
      ElseIf e.Contains(c) Then
        If x = 0 Then WriteLine("")
        Unindent()
        WriteLine(c)
        x = 1
      Else
        Write(c)
        x = 0
      End If
    Next
  End Sub
End Module

Verwendet Befehlszeilenargumente für die Eingabe

args(0) is the indenting chars
args(1) is the undenting chars
args(2) is the text to be indented.
Adam Speight
quelle
0

Powershell, 146 Bytes

param([char[]]$s,[char[]]$e,[char[]]$f)$f|%{}{if($_-in$s){$o;'  '*$i+$_;$o='  '*++$i;}elseif($_-in$e){$o;'  '*--$i+$_;$o='  '*$i}else{$o+=$_}}{$o}

Ungolfed Erklärung

param([char[]]$start,             # Cast as array of Chars
      [char[]]$end,
      [char[]]$string)
$string | foreach-object { } {    # For every char in string. Empty Begin block
    if ( $_ -in $start ) {        # If char is in start
        $o                        # Print stack ($o)
        '  ' * $i + $_            # Newline, indent, insert start char
        $o = '  ' * ++$i          # Set stack to ident (incremented)
    } elseif ( $_ -in $end ) {    # If char is in end
        $o                        # Print stack
        '  ' * --$i + $_          # Newline, decrement indent, insert end char
        $o = '  ' * $i            # Set stack to indent
    } else {
        $o+ = $_                  # Otherwise add character to stack
    }
} { $o }                          # Print remaining stack (if any)
Jonathan Leech-Pepin
quelle
0

C, 181 Zeichen

#define d(m,f)if(strchr(v[m],*s)){puts("");for(j=f;j--;)printf("  ");}
i;main(j,v,s)char**v,*s;{for(s=v[3];*s;s++){d(1,i++)d(2,--i)putchar(*s);d(1,i)if(!strchr(v[2],*(s+1)))d(2,i)}}

So ziemlich der einfachste Ansatz, den man sich vorstellen kann. Durchlaufen Sie die Zeichenfolge (v [3]). Wenn es sich um eine linke Klammer handelt (wie in v [1] definiert), erhöhen Sie die Einrückungsstufe. Wenn es sich um eine rechte Klammer handelt (wie in v [2] definiert), verringern Sie die Einrückungsstufe .

Cole Cameron
quelle
-1

C 114 121

main(i,x,s,c){while(~(c=getchar()))(s=x)|(x=2*!!strchr("(){}[]<>",c))?s=c-1&x,i-=x-2*s,printf("\n%*c",i-s,c):putchar(c);}

Nicht sehr schön, aber eine Lösung. Je nachdem, ob die Eingabe in Klammern beginnt oder endet, kann eine leere Zeile vor oder nach der Eingabe erscheinen.

Mit der neuen Einschränkung ist dieser Ansatz für das Golfen fast unbrauchbar.

esneider
quelle
Rückt die öffnenden Klammern nicht weit genug ein und gibt Leerzeilen zwischen aufeinanderfolgenden schließenden Zeilen aus.
Joey
@joey behoben, danke für das Feedback!
Esneider
Die Klammern werden weiterhin hart codiert, während sie Teil der Eingabe sein sollten. Derzeit stimmen nicht alle Antworten mit der Spezifikation überein.
Joey