Belirli bir parantez kullanarak dize girintileme


16

Programa aşağıdaki girdi verildiğinde:

  1. Blok başlangıç ​​karakterleri listesi
  2. Blok sonu karakterlerinin listesi
  3. Biçimlendirilecek bir dize

dizeyi girintili iki karakter kümesiyle ayrılmış bloklarla biçimlendirin.

Biçimlendirme, düzey başına iki boşluk ile yapılır ve parantezler aşağıdaki örnekte gösterildiği gibi yerleştirilir. Açma ve kapama karakter kümelerinin ayrık olduğunu varsayabilirsiniz.

İçin Örn {[(<ve }])>açılış ve karakter setleri kapatarak ve aşağıdaki dize olarak:

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

aşağıdaki çıktı beklenir:

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

“Parantez” karakter listesini zor kodlayamazsınız. Ancak girdinin nasıl verildiği belirtilmemiştir; bu komut satırı bağımsız değişkenleri veya istediğiniz gibi standart girdi yoluyla olabilir.


5
Her parantez için kapanış ve aynı sırada olduğunu varsayabilir miyiz?
Juan

Program bağımsız değişken olarak verilen parantez karakterlerini destekliyor mu? örneğin ./program 'p' 'q' <<< '1p23p45q67q8' Yoksa sadece desteklemek gerek yok {[(<ve }])>?
Joey Adams

@Joey, sanırım daha etkileyici olurdu.
Neil

joey: input 1. açık parantez karakteridir 2. parantez karakterlerini kapatın 3. girintilenecek dize. Juan: Kodun buna dayanmasına gerek olmasa da, demek istediğim, eğer sınırlama parantez karakterlerinin bir parçasıysa, girintiyi arttırır, eğer kapanış parantez karakterlerinin bir kısmı girintiyi azaltırsa.
Prashant Bhate

1
@Phrasant Bhate: Ve çıktıda?
Lowjacker

Yanıtlar:


6

Yakut, 106 101 96 95

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

Giriş, komut satırı üzerinden sağlanır.


1
Bunun ~-j+=1yerine kullanarak 4 karakter kaydedebilirsiniz (j+=1;j-1). Ayrıca, $.yerine her yerde kullanmak jizin verir j=0, bu başka bir karakter kaydeder.
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]/;}

En azından ortak ifadeleri ortadan kaldırmak için yer olmalı gibi görünüyor, ancak örneği ele alan hızlı bir yaklaşım ve Joey Adams'ın keyfi parantezler hakkında varsayımsal.


Gerçekten de iyileştirilmesi gereken çok şey vardı:

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

... ve biraz daha:

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

3

Mathematica (kodsuz 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
]

Ölçek

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

        ]

    }

}

Bir bonus olarak, mathematica ifadesini formatlamak için aşağıdaki fonksiyon kullanılabilir

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

EDIT (kodsuz golf) Yeni satırların oluşturulma şekli üzerinde ince taneli denetim ile güncellendi

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

Çıktı

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

Bu, çok karakterli isimlerle zor kod golfü indent. Hedefiniz maksimum düzeyde kod mu, yoksa okunabilirlik mi? Gerçekten de hedefiniz bu kodu kısaltmanın birkaç yolu vardır. Ayrıca: "Parantez" karakter listesinin kodunu yazamazsınız. " yine de burada yaptığınız tam olarak bu değil mi? Her neyse, çok olumsuz geldiğim için üzgünüm; bu sadece bana meydan okumanın garip bir yanıtı gibi geliyor.
Mr.Wizard

1
@ Mr.Wizard onun değil golf golf, ben kendi referans için ekledim [netleştirmek için güncellendi]. Sık sık bir sayfadan daha büyük olan biçimlendirilmemiş mathematica kodunu anlamak için kullanıyorum
Prashant Bhate

3

JavaScript, 255 227 205 karakter

Hey, uzunluğu bir bayta mükemmel uyuyor! : 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}

Bu bir işlevdir, başlangıç ​​karakterlerini, bitiş karakterlerini, sonra metni iletin.


Kendi düzenleme yorumunuz size karşı kullanıldı. : D
Kapı tokmağı

@Doorknob: Ben… Bunu hiç yapmamış olduğumu düşündüm. D: Çok üzgünüm. (Av
mıydınız

@Doorknob: Ve bana bunu hatırlattığın için teşekkürler; kısaltılmış :)
Ry-

Hayır avcılık değildi, sadece bu soruya tökezledi ama karar verdi ve ben buldum bu : 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

Görevin, iki parantez kümesinin sabit kodlu değil, girdinin bir parçası olmasını gerektirdiğini unutmayın.
Joey

@Joey kaydetti, bir süre düzeltmeye gideceğim. Teşekkürler
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

Kullanım : $ ./foo.py '(' ')' '(ab (cd (ef) gh) ij)'

Sonuç Çıktı:

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

printİfadelerden sonra boşluklara mı ihtiyacınız var ?
Zacharý

2

C - 213 209

Aptalca hatalardan nefret ediyorum ...>. <

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

İlk komut satırı bağımsız değişkeninden sol-parens, ikinci bağımsız değişkenten sağ-parens ve stdin'e girintili girdi okur.

Güzel baskı ve yorum:

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

Sadece boş satırlarla hatayı düzeltmek için 66 ekstra karaktere mal oldu :( Açıkçası, yeni bir yaklaşıma ihtiyacım var, ama şimdilik bir gün diyeceğim.

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

Oldukça hızlı ve kirli bir yaklaşım. Ardışık kapanış parantezleri arasında boş satırlar üretme hatası vardır, ancak aksi takdirde işi yapar (ya da sanırım). Bu hafta, daha iyi ve daha temiz bir çözüm için tekrar ziyaret edeceğim.

char * b açılış parantez kümesidir, char * e kapanış parantez kümesidir ve char * s girdi dizesidir.


1

Perl - 69 bayt

TMTOWTDI kodu basitleştirir

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

3
Parantezleri sabit kod olarak değil, girdi olarak almanız gerekir.
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=""}}}}

1

Perl - 89 85 bayt

Hojung Youn'un cevabının, blok karakterlerini iki argüman aracılığıyla kabul eden bir versiyonu.

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

Şöyle denir:

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

Çok güzel bir konsept, @Hojung ve Sorpigal. Yine de biraz kırılgan. Örneğin, yakın paren bağımsız değişkeninde] ve} ifadesini değiştirdiğinizde ve] karakter sınıfını kapatarak benzersiz bir paren hatasına yol açar. Benzer şekilde, açık kümenin ^ ile başladığını, belki de yakın kümedeki v ile eşleştiğini varsayalım; istenen [$ a] sınıfının tamamlayıcısını alırsınız. Bu yüzden cevabımda \ Q ... \ E kullandım. Paren olmayan karakterler için \ w +, örnek olarak çalışır, ancak 'x (foo-bar) y' '(' ')' gibi girdilere ne dersiniz? Elbette, kodun böyle bir şeyi işlemesi gerektiği açık değil.
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='')

Misal:

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

heinrich5991 ikinci satırı değiştirerek iki karakter kaydetmeyi önerdi_,p,q,t=sys.argv
Peter Taylor

1

Harika, 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}

Komut dosyasını bir indent.groovy dosyasına kaydedebilir ve şununla deneyebilirsiniz:
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ") ]}"


Cevabınızı görmeden önce bir saat boyunca harika bir şekilde denedim, benzer bir yaklaşım kullandım, ama benimki sizinkinden çok daha uzun, bu yüzden yayınlamak için bile uğraşmayacağım .. İyi iş! :)
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

Programın güncellenmemiş bir sürümü:

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

Programın argümanları (sırayla): açılış parantezleri, kapanış parantezleri ve girintili metin.

Örnek ($ komut satırı istemidir):

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

sınır kontrolü için boş bir sonlandırılmış dize if(*s)gerekiyor (aksi takdirde bu değerin değiştirilmesi gerekir if(s.length))


Görevin, iki parantez kümesinin sabit kodlu değil, girdinin bir parçası olmasını gerektirdiğini unutmayın.
Joey

0

Java

Yok codegolf version! Delim içeren bu split () sürümüne sahip olduğumuzu varsayarsak ,

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
StringUtilsStandart JDK'nın bir parçası değildir.
st0le

0

C 284 Boşluklu Olmayan Karakterler

Ben bir şaşkınlık hayranıyım ama iyi ...

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

Kullanımı: ./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;}}

İşlev dizeyi alır, ayırıcıları açar, ayırıcıları bağımsız değişken olarak sonlandırır.


0

C, 256

Parametreler:

  • e bitiş karakteridir,
  • n girinti,
  • b açma braketleri,
  • d kapatma braketleri.

Yatay kaydırma çubuğundan kaçınmak için kodu kırdım.

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

Komple program 363 karakterdir.

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

Dil golf oynamak için uygun değil, bu yüzden nadir bir yaklaşım kullandım. Konsola çıktı vermek için bir izleme dinleyicisi kullanma.

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

Girdi için komut satırı bağımsız değişkenlerini kullanır

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

0

Powershell, 146 Bayt

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}

Açıklanamayan Açıklama

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

Hemen hemen akla gelebilecek en basit yaklaşım. Dizeden (v [3]) yineleyin, eğer bir sol küme ayracıysa (v [1] 'de tanımlandığı gibi), girinti seviyesini artırın, eğer sağ küme ayracıysa (v [2]' de tanımlandığı gibi), girinti seviyesini azaltın .


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

Çok hoş değil, ama bir çözüm .. girdinin parantez ile başlayıp başlamamasına bağlı olarak önce / sonra boş bir çizgi görünebilir.

Yeni kısıtlama ile, bu yaklaşım golf için neredeyse işe yaramaz.


Açılış parantezlerini yeterince girintilemez ve ardışık kapananlar arasında boş satırlar çıkarır.
Joey

@ joey giderildi, geri bildiriminiz için teşekkür ederiz!
esneider

Girdinin bir parçası olması gerekirken hala parantezleri kodlar. Şu anda tüm cevaplar spesifikasyona uymuyor.
Joey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.