주어진 괄호를 사용하여 문자열을 들여 쓰기


16

프로그램에 다음과 같은 입력이 주어진 경우 :

  1. 블록 시작 문자 목록
  2. 블록 끝 문자 목록
  3. 형식화 할 문자열

들여 쓰기 된 두 문자 세트로 구분 된 블록으로 문자열을 형식화하십시오.

포맷은 레벨 당 2 개의 공백으로 이루어지며 아래 예제와 같이 괄호가 표시됩니다. 열기 및 닫기 문자 세트가 분리 된 것으로 가정 할 수 있습니다.

에 대한 예 {[(<}])>열기 및 문자 집합을 닫고 다음과 같은 문자열로 :

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

다음과 같은 결과가 예상됩니다.

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

"괄호"문자 목록을 하드 코딩 할 수 없습니다. 그러나 입력 방법은 지정되어 있지 않습니다. 원하는대로 명령 줄 인수 나 표준 입력을 사용할 수 있습니다.


5
각 괄호마다 닫는 괄호가 있고 동일한 순서로 있다고 가정 할 수 있습니까?
Juan

프로그램은 인수로 주어진 괄호 문자를 지원해야합니까? 예를 들어, ./program 'p' 'q' <<< '1p23p45q67q8' 또는 그것은 단지 지원 필요하지 않습니다 {[(<}])>?
Joey Adams

@Joey, 나는 그것이 더 인상적이지만 가정하지는 않을 것입니다.
Neil

joey : 입력은 1입니다. 괄호 문자 열기 2. 괄호 문자 닫기 3. 들여 쓰기 할 문자열입니다. Juan : 코드에 의존 할 필요는 없지만 delim이 괄호 문자를 여는 부분이고 들여 쓰기를 늘리는 경우, 괄호 문자를 닫는 부분이 들여 쓰기를 줄이면 의미합니다.
Prashant Bhate

1
@Phrasant Bhate : 그리고 출력에서?
Lowjacker

답변:


6

루비, 106 101 96 95

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

입력은 명령 행을 통해 제공됩니다.


1
~-j+=1대신을 사용하여 4자를 저장할 수 있습니다 (j+=1;j-1). 또한 $.대신에 모든 위치를 j사용하면을 제거하여 j=0다른 문자를 저장할 수 있습니다 .
Ventero

6

-131 96 94 자

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

적어도 일반적인 표현을 제거 할 여지가있는 것처럼 보이지만 임의의 괄호에 대한 Joey Adams의 가설뿐만 아니라 예제를 처리하는 것이 좋습니다.


실제로 개선의 여지가 충분했습니다.

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

... 그리고 여전히 조금 더 :

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

3

매스 매 티카 (비 코드 골프)

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
]

테스트

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

        ]

    }

}

보너스로, 다음 함수를 사용하여 수학 표현의 형식을 지정할 수 있습니다

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

EDIT (non code golf) 줄 바꿈이 렌더링되는 방식을 세밀하게 제어하여 업데이트했습니다.

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

산출

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

그것은 다중 문자 이름과 같은 코드 골프가 아닙니다 indent. 목표가 코드 나 가독성을 최대한 간직하고 있습니까? 코드가 실제로 목표라면 코드를 더 짧게 만드는 여러 가지 방법이 있습니다. 또한 : ""괄호 "문자 목록을 하드 코딩 할 수 없습니다." 아직 그게 네가 한 짓이 아니니? 어쨌든, 너무 부정적으로 들려서 죄송합니다. 그것은 당신의 도전에 대한 이상한 대답으로 저를 때리게합니다.
Mr.Wizard

1
@ Mr.Wizard는 코드 골프가 아니라 내 자신의 참조를 위해 그것을 추가했습니다 [명확하게 업데이트했습니다]. 나는 종종 페이지보다 큰 형식화되지 않은 수학 코드를 이해하기 위해 그것을 사용한다
Prashant Bhate

3

자바 스크립트, 255 227 205 자

이봐, 길이는 바이트에 완벽하게 맞습니다! :디

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}

그것은 함수이며 시작 문자, 끝 문자, 텍스트를 전달합니다.


귀하의 편집 의견이 귀하를 상대로 사용되었습니다. : D
Doorknob

@Doorknob : 전 ... 그런 일을 한 적이 없다고 생각했습니다. D : 정말 죄송합니다. (당신은 사냥하고 있었습니까?)
Ry-

@Doorknob : 그리고 이것에 대해 상기시켜 주셔서 감사합니다; 단축 :)
Ry-

나는 사냥을하지 않고 단지이 질문에 넘어졌지만, 나는 결정했다. 나는 이것을 발견 했다 : O : P
Doorknob

2

파이썬 – 162 자

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

이 작업은 하드 코딩되지 않은 두 세트의 괄호를 입력의 일부로 요구합니다.
Joey

@Joey는 잠시 후에 그것을 고칠 것입니다. 감사합니다
Juan

2

파이썬 2.7.X-136 자

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

사용법 : $ ./foo.py '(' ')' '(ab (cd (ef) gh) ij)'

결과 출력 :

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

print진술 뒤에 공백이 필요 합니까?
Zacharý

2

C - 213 209

어리석은 실수가 싫다 ...>. <

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

첫 번째 명령 행 인수에서 왼쪽 패런을 읽고 두 번째 인수에서 오른쪽 패런을 읽고 stdin에서 들여 쓰기를위한 입력을 읽습니다.

예쁜 인쇄 및 의견 :

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 ( 159225 자)

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

빈 줄로 버그를 수정하기 위해 66 명의 추가 문자가 필요했습니다. (솔직히 새로운 접근 방식이 필요하지만 지금은 하루라고 부를 것입니다.

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

다소 빠르고 더러운 접근법. 연속 닫는 괄호 사이에 빈 줄을 만드는 버그가 있지만 그렇지 않으면 작업을 수행합니다 (또는 그렇게 생각합니다). 이번 주 언젠가 더 나은 솔루션을 위해 다시 방문 할 것입니다.

char * b 는 여는 괄호 세트이고, char * e 는 닫는 괄호 세트이며, char * s 는 입력 문자열입니다.


1

펄-69 바이트

TMTOWTDI는 코드를 간단하게 만듭니다.

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

3
하드 코딩하지 않고 괄호를 입력으로 사용해야합니다.
Gareth

1

스칼라 (2.9), 211 자

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

-89 85 바이트

Hojung Youn의 대답 버전은 두 가지 인수를 통해 블록 문자를 허용합니다.

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

다음과 같이 호출됩니다.

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

@Hojung과 Sorpigal이라는 아주 좋은 개념. 그래도 약간 깨지기 쉽습니다. 예를 들어 close-paren 인수에서]와}를 바꾸면]는 문자 클래스를 닫아 일치하지 않는 paren 오류를 발생시킵니다. 유사하게, 열린 세트가 ^로 시작한다고 가정하면, 아마도 가까운 세트의 v와 일치합니다. 의도 된 [$ a] 클래스를 보완 해드립니다. 그래서 대답에 \ Q ... \ E를 사용했습니다. 괄호가 아닌 문자의 \ w +는 예제에서 작동하지만 'x (foo-bar) y' '(' ')'와 같은 입력은 어떻습니까? 물론 코드가 이와 같은 것을 처리해야한다는 것은 분명하지 않습니다.
DCharness

1

Python3, 184 개 182 문자

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

예:

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

heinrich5991은 에 두 번째 줄을 변경하여 두 개의 문자를 저장하는 제안_,p,q,t=sys.argv
피터 테일러

1

그루비, 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}

스크립트를 indent.groovy 파일에 저장하고 다음과 같이 사용해보십시오.
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ") ]} "


나는 대답을보기 전에 한 시간 동안 그루비를 시험해 보았지만 비슷한 aproach를 사용했지만 내 것이 너보다 훨씬 길어서 게시하지 않아도됩니다. :)
Fels

1

파이썬-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

프로그램의 압축되지 않은 버전 :

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

프로그램에 대한 인수는 순서대로 시작 괄호, 닫는 괄호 및 들여 쓰기 텍스트입니다.

예 ($는 명령 행 프롬프트) :

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

경계 검사를 위해 null로 끝나는 문자열이 if(*s)필요합니다 (그렇지 않으면 로 변경해야합니다 if(s.length))


이 작업은 하드 코딩되지 않은 두 세트의 괄호를 입력의 일부로 요구합니다.
Joey

0

자바

codegolf version! delim을 포함하는 이 split () 버전이 있다고 가정하면 ,

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
StringUtils표준 JDK의 일부가 아닙니다.
st0le

0

C 284 공백이 아닌 문자

난 난독 화 팬은 아니지만 ...

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

사용법 : ./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;}}

함수는 문자열, 여는 구분 기호, 끝 구분 기호를 인수로 사용합니다.


0

C, 256

매개 변수 :

  • e 는 결말 문자입니다.
  • n 은 들여 쓰기입니다.
  • b 여는 브래킷,
  • d 닫는 괄호.

가로 스크롤 막대를 피하기 위해 코드를 끊었습니다.

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

완전한 프로그램은 363 자입니다.

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

언어는 코드 골프에 적합하지 않기 때문에 드문 접근 방식을 사용했습니다. 추적 리스너를 사용하여 콘솔에 출력

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

입력에 명령 행 인수 사용

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

0

파워 쉘, 146 바이트

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}

풀리지 않은 설명

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 자

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

상상할 수있는 가장 간단한 접근법. 문자열 (v [3])을 반복합니다 (v [1]에 정의 된대로 왼쪽 괄호이면 들여 쓰기 수준을 높이고, v [2]에 정의 된대로) 오른쪽 들여 쓰기이면 들여 쓰기 수준을 줄입니다 .


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

별로 좋지는 않지만 해결책입니다. 입력이 괄호로 시작 / 종료되는지에 따라 전후에 빈 줄이 나타날 수 있습니다.

새로운 제한으로 인해이 방법은 골프에 거의 쓸모가 없습니다.


여는 괄호를 충분히 들여 쓰기하지 않고 연속적인 닫는 괄호 사이에 빈 줄을 출력합니다.
Joey

@ 조이 고정, 피드백 주셔서 감사합니다!
esneider

괄호는 여전히 입력의 일부 여야하는 동안 괄호를 하드 코딩합니다. 현재 모든 답변이 사양을 준수하지 않습니다.
Joey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.