Indentasi string menggunakan tanda kurung yang diberikan

16

Diberikan masukan berikut untuk program:

  1. Daftar karakter awal blok
  2. Daftar karakter ujung blok
  3. String untuk memformat

memformat string dengan blok dibatasi oleh dua set karakter yang indentasi.

Pemformatan dilakukan dengan dua spasi per level dan tanda kurung ditempatkan seperti yang ditunjukkan pada contoh di bawah ini. Anda dapat menganggap set karakter pembuka dan penutup menjadi terpisah.

Misalnya untuk {[(<dan }])>sebagai set karakter pembuka dan penutup dan string berikut:

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

output berikut diharapkan:

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

Anda tidak boleh membuat kode-keras daftar karakter "tanda kurung". Namun, bagaimana input diberikan tidak ditentukan; ini bisa berupa argumen baris perintah atau melalui input standar, seperti yang Anda inginkan.

Bhash Prashant
sumber
5
Bisakah kita berasumsi bahwa untuk setiap tanda kurung ada yang penutup, dan dalam urutan yang sama?
Juan
Apakah program harus mendukung setiap karakter tanda kurung yang diberikan sebagai argumen? misalnya ./program 'p' 'q' <<< '1p23p45q67q8' Atau apakah hanya perlu dukungan {[(<dan }])>?
Joey Adams
@ Joey, saya kira tidak, meskipun itu akan lebih mengesankan.
Neil
joey: inputnya adalah 1. karakter tanda kurung buka 2. tutup tanda kurung tanda kurung 3. string ke indent. Juan: kita dapat berasumsi bahwa, meskipun kode tidak perlu bergantung pada itu, yang saya maksud adalah jika delim adalah bagian dari membuka tanda kurung, meningkatkan indentasi, atau jika bagian dari penutupan tanda kurung menurun indentasi.
Prashant Bhate
1
@ Phrasant Bhate: Dan dalam output?
Lowjacker

Jawaban:

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}

Input disediakan melalui baris perintah.

Lowjacker
sumber
1
Anda dapat menyimpan 4 karakter dengan menggunakan ~-j+=1alih-alih (j+=1;j-1). Selain itu, menggunakan di $.mana - mana alih-alih jmemungkinkan Anda untuk menghapus j=0, yang menyimpan karakter lain.
Ventero
6

Perl - 131 96 94 karakter

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

Sepertinya harus ada ruang untuk menghilangkan ekspresi umum, setidaknya, tapi itu adalah contoh cepat yang menangani contoh, serta hipotesis Joey Adams tentang tanda kurung yang sewenang-wenang.


Memang ada banyak ruang untuk perbaikan:

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

... dan masih sedikit lagi:

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

Mathematica (golf bukan kode)

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
]

Uji

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

        ]

    }

}

Sebagai bonus, fungsi berikut dapat digunakan untuk memformat ekspresi mathematica

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

EDIT (golf bukan kode) Diperbarui dengan kontrol granular halus atas cara baris baru diberikan

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

Keluaran

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 ]
                 ]
             ]
         ]
Bhash Prashant
sumber
Itu bukan kode golf, dengan nama multi-karakter suka indent. Apakah tujuan Anda kode singkat maksimal, atau keterbacaan? Ada beberapa cara untuk membuat kode itu lebih pendek, jika itu memang tujuan Anda. Juga: "Anda tidak boleh membuat kode-keras daftar karakter" tanda kurung "." namun bukankah itu tepatnya yang Anda lakukan di sini? Bagaimanapun, maaf kedengarannya negatif; itu hanya menurut saya jawaban yang aneh untuk tantangan Anda sendiri.
Mr.Wizard
1
@ Mr.Wizard bukan kode golfnya, saya telah menambahkannya untuk referensi saya sendiri [diperbarui untuk memperjelas]. Saya sering menggunakannya untuk memahami kode mathematica yang tidak diformat yang menjangkau lebih dari satu halaman
Prashant Bhate
3

JavaScript, 255 227 205 karakter

Hei, panjangnya sangat cocok dalam satu 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}

Ini sebuah fungsi, berikan karakter awal, karakter akhir, lalu teks.

Ry-
sumber
Komentar edit Anda sendiri telah digunakan untuk melawan Anda. : D
Gagang Pintu
@ Doorknob: Saya… saya pikir saya belum pernah melakukan itu. D: Saya sangat menyesal. (Apakah kamu berburu?)
Ry-
@ Doorknob: Dan terima kasih sudah mengingatkan saya tentang ini; disingkat :)
Ry-
Tidak, saya tidak berburu, hanya menemukan pertanyaan ini, tetapi saya memutuskan untuk, dan saya menemukan ini : O: P
Doorknob
2

Python - 162 karakter

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
sumber
Perhatikan bahwa tugas memanggil dua set tanda kurung untuk menjadi bagian dari input, bukan hardcode.
Joey
@ Joey mencatat, saya akan segera memperbaiki itu sebentar lagi. Terima kasih
Juan
2

Python 2.7.X - 136 karakter

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

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

Output yang dihasilkan:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)
arrdem
sumber
Apakah Anda perlu spasi setelah printpernyataan?
Zacharý
2

C - 213 209

Aku benci kesalahan bodoh ...>. <

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

Membaca paren kiri dari argumen baris perintah pertama, paren kanan dari argumen kedua, dan masukan untuk indentasi pada stdin.

Dicetak cantik & dikomentari:

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
sumber
1

C ( 159 225 karakter)

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

Harganya 66 karakter tambahan hanya untuk memperbaiki bug dengan baris kosong :( Terus terang, saya butuh pendekatan baru, tapi saya akan menyebutnya sehari untuk saat ini.

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

Pendekatan yang agak cepat & kotor. Ini memiliki bug menghasilkan garis kosong antara kurung tutup berturut-turut, tetapi jika tidak ia melakukan pekerjaan (atau jadi saya pikir). Saya akan mengunjungi lagi untuk solusi yang lebih baik & bersih, sekitar minggu ini.

char * b adalah set kurung pembuka, char * e adalah set kurung tutup penutupan dan char * s adalah string input.

Harry K.
sumber
1

Perl - 69 byte

TMTOWTDI menyederhanakan kode

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge
Hojung Youn
sumber
3
Anda seharusnya mengambil tanda kurung sebagai input, bukan menuliskannya dalam hardcode.
Gareth
1

Scala (2.9), 211 karakter

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
sumber
1

Perl - 89 85 byte

Versi jawaban Hojung Youn yang menerima karakter blok melalui dua argumen.

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

Disebut seperti:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'
Sorpigal
sumber
Konsep yang sangat bagus, @Hojung dan Sorpigal. Ini agak rapuh. Misalnya, menukar] dan} dalam argumen close-paren, dan] menutup kelas karakter, yang mengarah ke kesalahan paren yang tidak cocok. Demikian pula, misalkan set terbuka dimulai dengan ^, mungkin untuk mencocokkan v pada set dekat; Anda akan mendapatkan komplemen dari kelas [$ a] yang dimaksud. Itu sebabnya saya menggunakan \ Q ... \ E dalam jawaban saya. Contoh \ w + untuk karakter non-paren berfungsi sebagai contoh, tetapi bagaimana dengan input seperti 'x (bilah foo) y' '(' ')'? Tentu saja, tidak jelas kode perlu menangani sesuatu seperti itu.
DCharness
1

Python3, 184 182 karakter

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

Contoh:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
Alexandru
sumber
heinrich5991 menyarankan untuk menyimpan dua karakter dengan mengubah baris kedua menjadi_,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}

Anda dapat menyimpan skrip dalam file indent.groovy dan mencobanya dengan:
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ")) ]} "

Marco Martinelli
sumber
Saya mencoba berkeliling di groovy selama satu jam sebelum melihat jawaban Anda, saya menggunakan pendekatan yang sama, tetapi milik saya jauh lebih lama daripada jawaban Anda sehingga saya tidak akan repot memposting .. Kerja bagus! :)
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

Versi program yang ungolfed:

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

Argumen untuk program ini adalah (dalam urutan): tanda kurung buka, tanda kurung penutup, dan teks untuk indentasi.

Contoh ($ is prompt baris perintah):

$ python indent.py "{[(<" "}])>" "abc{xyz{text[note{comment(t{ex}t)abc}]}}"
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
pegolf9338
sumber
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);}

membutuhkan string diakhiri null untuk memeriksa batas (jika tidak if(*s)perlu diubah ke if(s.length))

ratchet freak
sumber
Perhatikan bahwa tugas memanggil dua set tanda kurung untuk menjadi bagian dari input, bukan hardcode.
Joey
0

Jawa

Bukan codegolf version! Dengan asumsi kita memiliki versi split () yang mencakup delims,

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;
}
Bhash Prashant
sumber
2
StringUtilsbukan bagian dari JDK Standar.
st0le
0

C 284 Karakter spasi Non White

Saya bukan penggemar kebingungan tapi yah ...

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

Penggunaan: ./program start_brackets end_brackets string_to_parse

Mihai Bişog
sumber
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;}}

Fungsi mengambil string, membuka pembatas, mengakhiri pembatas sebagai argumen.

migimaru
sumber
0

C, 256

Parameter:

  • e adalah char akhir,
  • n adalah lekukan,
  • b kurung pembuka,
  • d kurung penutup.

Saya memecahkan kode untuk menghindari scrollbar horizontal.

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

Program lengkap adalah 363 karakter.

#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
sumber
0

VB.net (? C)

Bahasa tidak cocok untuk kode golf, jadi saya menggunakan pendekatan yang tidak umum. Menggunakan pendengar jejak untuk output ke konsol.

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

Menggunakan argumen commandline untuk input

args(0) is the indenting chars
args(1) is the undenting chars
args(2) is the text to be indented.
Adam Speight
sumber
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}

Penjelasan Tidak Dikunci

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
sumber
0

C, 181 karakter

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

Cukup banyak pendekatan yang paling mudah dibayangkan. Iterate melalui string (v [3]), jika itu adalah kurung kurawal (seperti didefinisikan dalam v [1]), tingkatkan tingkat indentasi, jika itu kurung kurawal (seperti yang didefinisikan dalam v [2]), kurangi level indentasi .

Cole Cameron
sumber
-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);}

Tidak terlalu bagus, tetapi sebuah solusi .. sebuah baris kosong mungkin muncul sebelum / sesudah tergantung pada apakah input dimulai / selesai dengan tanda kurung.

Dengan pembatasan baru, pendekatan ini hampir tidak berguna untuk bermain golf.

esneider
sumber
Tidak membuat indentasi pembuka cukup jauh dan menghasilkan garis kosong antara yang tertutup berturut-turut.
Joey
@ joey diperbaiki, terima kasih atas umpan baliknya!
esneider
Masih mengkode kode tanda kurung sementara mereka harus menjadi bagian dari input. Saat ini semua jawaban tidak sesuai dengan spesifikasi.
Joey