Thụt một chuỗi sử dụng dấu ngoặc đơn đã cho


16

Đưa ra đầu vào sau cho chương trình:

  1. Danh sách các ký tự bắt đầu khối
  2. Danh sách các ký tự kết thúc khối
  3. Một chuỗi để định dạng

định dạng chuỗi với các khối được giới hạn bởi hai bộ ký tự thụt vào.

Việc định dạng được thực hiện với hai khoảng trắng trên mỗi cấp độ và dấu ngoặc đơn được đặt như trong ví dụ bên dưới. Bạn có thể giả sử các bộ ký tự mở và đóng là rời rạc.

Ví dụ: {[(<}])>là bộ ký tự mở và đóng và chuỗi sau:

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

đầu ra sau đây sẽ được mong đợi:

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

Bạn không thể mã hóa danh sách các dấu ngoặc đơn của bộ đệm. Làm thế nào đầu vào được đưa ra không được chỉ định, mặc dù; đây có thể là đối số dòng lệnh hoặc thông qua đầu vào tiêu chuẩn, như bạn muốn.


5
Chúng ta có thể giả sử rằng đối với mỗi dấu ngoặc đơn có một dấu đóng và theo cùng một thứ tự không?
Juan

Chương trình có phải hỗ trợ bất kỳ ký tự dấu ngoặc đơn nào được đưa ra làm đối số không? Ví dụ, ./program 'p' 'q' <<< '1p23p45q67q8' hoặc nó chỉ cần hỗ trợ {[(<}])>?
Joey Adams

@Joey, tôi cho là không, mặc dù điều đó sẽ ấn tượng hơn.
Neil

joey: đầu vào là 1. mở các ký tự dấu ngoặc đơn 2. đóng các ký tự dấu ngoặc đơn 3. chuỗi để thụt lề. Juan: chúng ta có thể giả định rằng, mặc dù mã không cần phải dựa vào điều đó, nhưng ý tôi là nếu delim là một phần của việc mở ký tự dấu ngoặc đơn, tăng thụt lề, khác nếu một phần của ký tự đóng dấu ngoặc đơn giảm.
Prashant Bhate

1
@Phrasant Bhate: Và trong đầu ra?
Lowjacker

Câu trả lời:


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}

Đầu vào được cung cấp thông qua dòng lệnh.


1
Bạn có thể lưu 4 ký tự bằng cách sử dụng ~-j+=1thay vì (j+=1;j-1). Ngoài ra, sử dụng $.ở mọi nơi thay vì jcho phép bạn xóa j=0, giúp lưu một ký tự khác.
Ventero

6

Perl - 131 96 94 ký tự

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

Có vẻ như nên có chỗ để loại bỏ các biểu thức phổ biến, ít nhất, nhưng đó là một cách nhanh chóng để xử lý ví dụ, cũng như giả thuyết của Joey Adams về dấu ngoặc tùy ý.


Thật vậy, có rất nhiều chỗ để cải thiện:

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

... và vẫn còn một chút nữa:

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

3

Mathematica (golf không mã)

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
]

Kiểm tra

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

        ]

    }

}

Là một phần thưởng, chức năng sau có thể được sử dụng để định dạng biểu thức mathicala

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

EDIT (golf không mã) Được cập nhật với kiểm soát chi tiết tốt về cách hiển thị dòng mới

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

Đầu ra

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

Đó là khó chơi golf, với tên nhiều nhân vật như thế indent. Là mục tiêu của bạn tối đa mã terse, hoặc khả năng đọc? Có một số cách để làm cho mã đó ngắn hơn, nếu đó thực sự là mục tiêu của bạn. Ngoài ra: "Bạn không thể mã hóa danh sách các dấu ngoặc đơn của bộ đệm." nhưng đó không phải là chính xác những gì bạn đã làm ở đây? Dù sao, xin lỗi để âm thanh quá tiêu cực; nó chỉ đánh vào tôi như một câu trả lời lạ cho thử thách của chính bạn.
Mr.Wizard

1
@ Mr.Wizard không phải là mã golf, tôi đã thêm nó để tham khảo cho riêng mình [được cập nhật để làm cho nó rõ ràng]. Tôi thường xuyên sử dụng nó để hiểu mã toán học chưa được định dạng trải rộng hơn một trang
Prashant Bhate

3

JavaScript, 255 227 205 ký tự

Hey, chiều dài của nó phù hợp hoàn hảo trong một 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}

Đó là một chức năng, truyền cho nó các ký tự bắt đầu, các ký tự kết thúc, sau đó là văn bản.


Nhận xét chỉnh sửa của riêng bạn đã được sử dụng chống lại bạn. : D
Doorknob

@Doorknob: Tôi đã nghĩ rằng tôi chưa bao giờ làm điều đó. D: Tôi rất xin lỗi. (Bạn có đang đi săn không?)
Ry-

@Doorknob: Và cảm ơn vì đã nhắc nhở tôi về điều này; rút ngắn :)
Ry-

Không, tôi không săn lùng, chỉ vấp phải câu hỏi này, nhưng tôi đã quyết định, và tôi đã tìm thấy điều này : O: P
Doorknob

2

Python - 162 ký tự

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

Lưu ý rằng tác vụ gọi hai bộ dấu ngoặc đơn là một phần của đầu vào, không được mã hóa cứng.
Joey

@Joey lưu ý, tôi sẽ đi xung quanh để sửa nó trong một thời gian. Cảm ơn
Juan

2

Python 2.7.X - 136 ký tự

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

Cách sử dụng : $ ./foo.py '(' ')' '(ab (cd (ef) gh) ij)'

Kết quả đầu ra:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)

Bạn có cần khoảng trắng sau các printbáo cáo?
Zacharý

2

C - 213 209

Tôi ghét những sai lầm ngu ngốc ...>. <

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

Đọc parens trái từ đối số dòng lệnh đầu tiên, parens phải từ đối số thứ hai và nhập vào thụt vào stdin.

Khá in & nhận xét:

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

1

C ( 159 225 ký tự)

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

Tôi phải trả thêm 66 ký tự chỉ để sửa lỗi với các dòng trống :( Thành thật mà nói, tôi cần một cách tiếp cận mới, nhưng bây giờ tôi sẽ gọi nó là một ngày.

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

Một cách tiếp cận khá nhanh và bẩn. Nó có một lỗi tạo ra các dòng trống giữa dấu ngoặc đơn đóng liên tiếp, nhưng nếu không thì nó thực hiện công việc (hoặc tôi nghĩ vậy). Tôi sẽ xem xét lại nó cho một giải pháp tốt hơn và sạch hơn, đôi khi trong tuần này.

char * b là tập ngoặc đơn mở, char * e là tập ngoặc đơn đóng và char * s là chuỗi đầu vào.


1

Perl - 69 byte

TMTOWTDI làm cho mã đơn giản

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge

3
Bạn nên lấy dấu ngoặc đơn làm đầu vào, không mã hóa chúng.
Gareth

1

Scala (2.9), 211 ký tự

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

1

Perl - 89 85 byte

Một phiên bản câu trả lời của Hojung Youn chấp nhận các ký tự khối thông qua hai đối số.

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

Được gọi là:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'

Khái niệm rất hay, @Hojung và Sorpigal. Nó là một chút mong manh, mặc dù. Ví dụ, hoán đổi] và} trong đối số paren gần và] đóng lớp ký tự, dẫn đến lỗi paren chưa từng có. Tương tự, giả sử tập mở bắt đầu bằng ^, có lẽ để khớp với v trong tập đóng; bạn sẽ nhận được phần bổ sung của lớp [$ a] dự định. Đó là lý do tại sao tôi sử dụng \ Q ... \ E trong câu trả lời của mình. Ví dụ \ w + cho các ký tự không paren hoạt động, nhưng đối với đầu vào như 'x (foo-bar) y' '(' ')' thì sao? Tất nhiên, không rõ ràng mã cần xử lý một cái gì đó như thế.
DCharness

1

Python3, 184 182 ký tự

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

Thí dụ:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}

heinrich5991 đề nghị cứu hai nhân vật bằng cách thay đổi dòng thứ hai thành_,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}

Bạn có thể lưu tập lệnh trong một tệp indent.groovy và thử nó với:
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ") ]} "


Tôi đã thử xung quanh trong một giờ trước khi thấy câu trả lời của bạn, tôi đã sử dụng một lời nói tương tự, nhưng của tôi dài hơn của bạn rất nhiều vì vậy tôi thậm chí sẽ không đăng bài .. Tốt lắm! :)
Fels

1

Con trăn - 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

Một phiên bản vô văn hóa của chương trình:

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

Các đối số của chương trình là (theo thứ tự): dấu ngoặc đơn mở, dấu ngoặc đơn đóng và văn bản thụt lề.

Ví dụ ($ là dấu nhắc dòng lệnh):

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

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

cần một chuỗi kết thúc null để kiểm tra giới hạn (nếu không thì if(*s)cần phải thay đổi thành if(s.length))


Lưu ý rằng tác vụ gọi hai bộ dấu ngoặc đơn là một phần của đầu vào, không được mã hóa cứng.
Joey

0

Java

Không codegolf version! Giả sử chúng ta có phiên bản split () này bao gồm các lần xóa,

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

2
StringUtilskhông phải là một phần của JDK tiêu chuẩn.
st0le

0

C 284 Nhân vật không gian trắng

Tôi không phải là người hâm mộ của obfuscation nhưng cũng ...

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

Cách sử dụng: ./program start_brackets end_brackets string_to_parse


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

Hàm lấy chuỗi, mở dấu phân cách, kết thúc dấu phân cách làm đối số.


0

C, 256

Thông số:

  • e là char kết thúc,
  • n là vết lõm,
  • b dấu ngoặc mở
  • d dấu ngoặc đóng.

Tôi đã phá mã lên để tránh thanh cuộn ngang.

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

Chương trình hoàn thành là 363 ký tự.

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

0

VB.net (? C)

Ngôn ngữ không phù hợp với chơi golf mã, vì vậy tôi đã sử dụng một cách tiếp cận không phổ biến. Sử dụng một trình nghe theo dõi để xuất ra giao diện điều khiển.

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

Sử dụng dòng lệnh args cho đầu vào

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

0

Powershell, 146 byte

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}

Giải thích

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)

0

C, 181 ký tự

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

Khá nhiều cách tiếp cận đơn giản nhất có thể tưởng tượng. Lặp lại qua chuỗi (v [3]), nếu đó là một dấu ngoặc trái (như được định nghĩa trong v [1]), hãy tăng mức độ thụt lề, nếu đó là một dấu ngoặc phải (như được định nghĩa trong v [2]), giảm mức độ thụt lề .


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

Không đẹp lắm, nhưng một giải pháp .. một dòng trống có thể xuất hiện trước / sau tùy thuộc vào việc đầu vào bắt đầu / kết thúc bằng dấu ngoặc đơn.

Với những hạn chế mới, cách tiếp cận này gần như vô dụng đối với việc chơi golf.


Không thụt dấu ngoặc đơn mở đủ xa và tạo ra các dòng trống giữa các lần đóng liên tiếp.
Joey

@joey đã sửa, cảm ơn bạn đã phản hồi!
esneider

Nó vẫn mã hóa các dấu ngoặc đơn trong khi chúng phải là một phần của đầu vào. Hiện tại tất cả các câu trả lời không phù hợp với đặc điểm kỹ thuật.
Joey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.