Wcięcie ciągu za pomocą podanych nawiasów

16

Biorąc pod uwagę następujące dane wejściowe do programu:

  1. Lista znaków początku bloku
  2. Lista znaków końca bloku
  3. Ciąg do sformatowania

sformatuj ciąg z blokami ograniczonymi dwoma wciętymi zestawami znaków.

Formatowanie odbywa się za pomocą dwóch spacji na poziom, a nawiasy są umieszczane, jak pokazano w poniższym przykładzie. Możesz założyć, że zestawy znaków otwierających i zamykających są rozłączne.

Np. Dla {[(<i }])>jako otwierające i zamykające zestawy znaków i następujący ciąg:

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

oczekiwane są następujące wyniki:

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

Nie można zakodować na stałe listy znaków „w nawiasach”. Sposób podawania danych wejściowych nie jest jednak określony; mogą to być argumenty wiersza poleceń lub standardowe wejście, jak chcesz.

Prashant Bhate
źródło
5
Czy możemy założyć, że dla każdego nawiasu jest zamykający i w tej samej kolejności?
Juan
Czy program musi obsługiwać znaki w nawiasach podane jako argumenty? np. ./program 'p' 'q' <<< '1p23p45q67q8' Czy potrzebuje tylko wsparcia {[(<i }])>?
Joey Adams,
@Joey, zakładam, że nie, choć byłoby to tym bardziej imponujące.
Neil,
joey: dane wejściowe to 1. otwarte znaki w nawiasach 2. zamknij znaki w nawiasach 3. ciąg znaków do wcięcia. Juan: możemy założyć, że chociaż kod nie musi na tym polegać, mam na myśli to, że jeśli separator jest częścią otwierających znaków w nawiasach, zwiększ wcięcie, w przeciwnym razie, jeśli część zamykających znaków w nawiasie zmniejszy wcięcie.
Prashant Bhate,
1
@Phrasant Bhate: A w treści?
Lowjacker

Odpowiedzi:

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}

Dane wejściowe są dostarczane z wiersza poleceń.

Lowjacker
źródło
1
Możesz zapisać 4 znaki, używając ~-j+=1zamiast (j+=1;j-1). Dodatkowo użycie $.wszędzie zamiast jpozwala na usunięcie j=0, co oszczędza inną postać.
Ventero,
6

Perl - 131 96 94 znaków

$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]/;}

Wydaje się, że przynajmniej powinno być miejsce na wyeliminowanie typowych wyrażeń, ale jest to szybkie ujęcie, które obsługuje ten przykład, a także hipotezę Joeya Adamsa dotyczącą arbitralnych nawiasów.


Rzeczywiście było wiele do zrobienia:

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

... i jeszcze trochę więcej:

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

Matematyka (golf bez kodu)

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
]

Test

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

        ]

    }

}

Jako bonus można użyć następującej funkcji do sformatowania wyrażenia matematycznego

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

EDYCJA (bez kodu golfowego) Zaktualizowano z dokładną szczegółową kontrolą nad sposobem renderowania znaków nowej linii

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

Wynik

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
źródło
To prawie nie golf golfowy, z nazwami wieloznakowymi jak indent. Czy Twoim celem jest maksymalnie zwięzły kod lub czytelność? Istnieje wiele sposobów skrócenia tego kodu, jeśli to rzeczywiście jest twój cel. Ponadto: „Nie można zakodować na stałe listy znaków„ w nawiasach ”.” ale czy nie jest to dokładnie to, co tutaj zrobiłeś? W każdym razie przepraszam, że brzmi tak negatywnie; wydaje mi się to dziwną odpowiedzią na twoje własne wyzwanie.
Mr.Wizard
1
@ Mr.Wizard to nie kod golfa, dodałem go dla własnego odniesienia [zaktualizowano, aby było jasne]. Często używam go do zrozumienia niesformatowanego kodu matematycznego, który obejmuje więcej niż stronę
Prashant Bhate,
3

JavaScript, 255 227 205 znaków

Hej, jego długość idealnie pasuje do bajtu! :RE

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}

Jest to funkcja, podaj znaki początkowe, końcowe, a następnie tekst.

Ry-
źródło
Twój własny komentarz do edycji został wykorzystany przeciwko tobie. : D
Klamka
@Doorknob: Ja… Myślałem, że nigdy tego nie zrobiłem. D: Tak mi przykro. (
Polowałeś
@Doorknob: I dzięki za przypomnienie mi o tym; skrócone :)
Ry-
Nie, nie polowałem, tylko natknąłem się na to pytanie, ale postanowiłem i znalazłem to : O: P
Klamka
2

Python - 162 znaki

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
źródło
Zauważ, że zadanie wymaga, aby dwa zestawy nawiasów były częścią danych wejściowych, a nie zakodowane na stałe.
Joey,
@Jeyey zauważył, że zajmę się tym za chwilę. Dzięki
Juan
2

Python 2.7.X - 136 znaków

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

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

Wynikowy wynik:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)
arrdem
źródło
Czy potrzebujesz spacji po printinstrukcjach?
Zacharý
2

C - 213 209

Nienawidzę głupich błędów ...>. <

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

Czyta lewy parens z pierwszego argumentu wiersza poleceń, prawy parens z drugiego argumentu i wprowadza wcięcie na standardowe wejście.

Dość wydrukowane i skomentowane:

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);
  }
}
Robaczek świętojański
źródło
1

C ( 159 225 znaków)

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

Kosztowało mnie 66 dodatkowych znaków, aby naprawić błąd z pustymi liniami :( Szczerze mówiąc, potrzebuję nowego podejścia, ale na razie na to dzień.

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

Raczej szybkie i brudne podejście. Ma błąd polegający na wytwarzaniu pustych linii między kolejnymi nawiasami zamykającymi, ale w przeciwnym razie działa (tak mi się wydaje). Wrócę do niego, aby znaleźć lepsze i czystsze rozwiązanie, w tym tygodniu.

char * b to nawias otwierający, char * e to zamykający zestaw nawiasów, a char * s to ciąg wejściowy.

Harry K.
źródło
1

Perl - 69 bajtów

TMTOWTDI upraszcza kod

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge
Hojung Youn
źródło
3
Powinieneś brać nawiasy jako dane wejściowe, a nie kodować na stałe.
Gareth
1

Scala (2.9), 211 znaków

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
źródło
1

Perl - 89 85 bajtów

Wersja odpowiedzi Hojunga Youna, która akceptuje znaki blokowe za pomocą dwóch argumentów.

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

Nazywany jak:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'
Sorpigal
źródło
Bardzo fajna koncepcja, @Hojung i Sorpigal. Jest to jednak trochę kruche. Na przykład zamień] i} w argumencie close-paren, a] zamyka klasę znaków, co prowadzi do niedopasowanego błędu paren. Podobnie, załóżmy, że otwarty zestaw zaczyna się od ^, być może w celu dopasowania v w zamkniętym zestawie; dostaniesz uzupełnienie planowanej klasy [$ a]. Dlatego użyłem \ Q ... \ E w mojej odpowiedzi. \ W + dla znaków nieparencyjnych działa w tym przykładzie, ale co z wprowadzaniem, takim jak „x (foo-bar) y” ”(„ ”)? Oczywiście nie jest jasne, czy kod musi obsługiwać coś takiego.
DCharness
1

Python3, 184 182 znaków

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

Przykład:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
Alexandru
źródło
heinrich5991 zasugerował uratowanie dwóch znaków, zmieniając drugą linię na_,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}

Możesz zapisać skrypt w pliku indent.groovy i wypróbować go z:
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ") ]} ”

Marco Martinelli
źródło
Próbowałem przez godzinę w groovy, zanim zobaczyłem twoją odpowiedź, zastosowałem podobne podejście, ale moje jest znacznie dłuższe niż twoje, więc nawet nie będę się starał pisać. Dobra robota! :)
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

Nie golfowa wersja programu:

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

Argumentami programu są (w kolejności): nawiasy otwierające, nawiasy zamykające i tekst do wcięcia.

Przykład ($ jest wierszem poleceń):

$ python indent.py "{[(<" "}])>" "abc{xyz{text[note{comment(t{ex}t)abc}]}}"
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
golfer9338
źródło
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);}

wymaga łańcucha zakończonego znakiem null do sprawdzenia granic (w przeciwnym razie if(*s)należy zmienić na if(s.length))

maniak zapadkowy
źródło
Zauważ, że zadanie wymaga, aby dwa zestawy nawiasów były częścią danych wejściowych, a nie zakodowane na stałe.
Joey,
0

Jawa

Non codegolf version! Zakładając, że mamy tę wersję split (), która zawiera ograniczenia,

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
źródło
2
StringUtilsnie jest częścią Standardowego JDK.
st0le,
0

C 284 Postacie inne niż spacja

Nie jestem fanem zaciemniania, ale cóż ...

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

Zastosowanie: ./program start_brackets end_brackets string_to_parse

Mihai Bişog
źródło
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;}}

Funkcja przyjmuje ciąg znaków, otwierając ograniczniki, kończąc ograniczniki jako argumenty.

migimaru
źródło
0

C, 256

Parametry:

  • mi jest końcowym char,
  • n jest wcięciem,
  • b klamry otwierające,
  • d klamry zamykające.

Zerwałem kod, aby uniknąć poziomego paska przewijania.

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

Cały program ma 363 znaki.

#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
źródło
0

VB.net (? C)

Język nie jest odpowiedni do gry w golfa, więc zastosowałem nietypowe podejście. Używanie nasłuchiwania śledzenia do wysyłania danych do konsoli.

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

Używa argumentów wiersza polecenia jako danych wejściowych

args(0) is the indenting chars
args(1) is the undenting chars
args(2) is the text to be indented.
Adam Speight
źródło
0

PowerShell, 146 bajtów

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}

Niegolfowane wyjaśnienie

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
źródło
0

C, 181 znaków

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

Prawie najprostsze podejście, jakie można sobie wyobrazić. Iteruj przez ciąg (v [3]), jeśli jest to lewy nawias klamrowy (zgodnie z definicją w v [1]), zwiększ poziom wcięcia, jeśli jest to prawy nawias klamrowy (zgodnie z definicją w v [2]), zmniejsz poziom wcięcia .

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

Niezbyt fajne, ale rozwiązanie ... pusta linia może pojawić się przed / po w zależności od tego, czy dane wejściowe zaczynają się / kończą nawiasami.

Dzięki nowym ograniczeniom takie podejście jest prawie bezużyteczne do gry w golfa.

Esneider
źródło
Nie wcina wystarczająco nawiasów otwierających i wyświetla puste linie między kolejnymi zamykającymi.
Joey,
@joey naprawiono, dziękuję za opinie!
esneider
Nadal sztywno koduje nawiasy, podczas gdy powinny one być częścią danych wejściowych. Obecnie wszystkie odpowiedzi nie są zgodne ze specyfikacją.
Joey,