Indenter une chaîne en utilisant des parenthèses données

16

Compte tenu de la contribution suivante au programme:

  1. Liste des caractères de début de bloc
  2. Liste des caractères de fin de bloc
  3. Une chaîne à formater

formatez la chaîne avec les blocs délimités par les deux jeux de caractères en retrait.

Le formatage se fait avec deux espaces par niveau et les parenthèses sont placées comme indiqué dans l'exemple ci-dessous. Vous pouvez supposer que les ensembles de caractères d'ouverture et de fermeture sont disjoints.

Par exemple pour {[(<et }])>comme les jeux de caractères d'ouverture et de fermeture et la chaîne suivante:

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

la sortie suivante serait attendue:

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

Vous ne pouvez pas coder en dur la liste des caractères «entre parenthèses». La manière dont l'entrée est donnée n'est cependant pas spécifiée; il peut s'agir d'arguments en ligne de commande ou via une entrée standard, comme vous le souhaitez.

Prashant Bhate
la source
5
Pouvons-nous supposer que pour chaque parenthèse, il y a une clôture, et dans le même ordre?
Juan
Le programme doit-il prendre en charge les caractères entre parenthèses donnés comme arguments? par exemple ./program 'p' 'q' <<< '1p23p45q67q8' Ou a-t-il seulement besoin de support {[(<et }])>?
Joey Adams
@Joey, je suppose que non, mais ce serait d'autant plus impressionnant.
Neil
joey: les entrées sont 1. ouvrir les caractères entre parenthèses 2. fermer les caractères entre parenthèses 3. chaîne à mettre en retrait. Juan: nous pouvons supposer que, bien que le code n'ait pas besoin de s'appuyer sur cela, ce que je veux dire est que si délim fait partie des caractères d'ouverture de parenthèse, augmente le retrait, sinon si une partie des caractères de parenthèse de fermeture diminue le retrait.
Prashant Bhate
1
@Phrasant Bhate: Et dans la sortie?
Lowjacker

Réponses:

6

Rubis, 106 101 96 95

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

L'entrée est fournie via la ligne de commande.

Lowjacker
la source
1
Vous pouvez enregistrer 4 caractères en utilisant ~-j+=1au lieu de (j+=1;j-1). De plus, utiliser $.partout au lieu de jvous permet de supprimer le j=0, ce qui enregistre un autre personnage.
Ventero
6

Perl - 131 96 94 caractères

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

Il semble qu'il devrait y avoir de la place pour éliminer les expressions courantes, au moins, mais c'est une prise rapide qui gère l'exemple, ainsi que l'hypothèse de Joey Adams sur les crochets arbitraires.


Il y avait, en effet, beaucoup de place pour l'amélioration:

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

... et encore un peu plus:

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

Mathematica (golf sans code)

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
]

Tester

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

        ]

    }

}

En prime, la fonction suivante peut être utilisée pour formater l'expression mathématique

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

EDIT (golf sans code) Mis à jour avec un contrôle granulaire fin sur la façon dont les nouvelles lignes sont rendues

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

Production

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
la source
Ce n'est guère du golf de code, avec des noms à plusieurs caractères comme indent. Votre objectif est-il un code au maximum concis ou de lisibilité? Il existe plusieurs façons de raccourcir ce code, si tel est votre objectif. Aussi: "Vous ne pouvez pas coder en dur la liste des caractères" parenthèses "." n'est-ce pas exactement ce que vous avez fait ici? Quoi qu'il en soit, désolé de paraître si négatif; cela me semble être une réponse étrange à votre propre défi.
Mr.Wizard
1
@ Mr.Wizard ce n'est pas du golf de code, je l'ai ajouté pour ma propre référence [mis à jour pour que ce soit clair]. Je l'utilise fréquemment pour comprendre du code mathématique non formaté qui s'étend sur plus d'une page
Prashant Bhate
3

JavaScript, 255 227 205 caractères

Hé, sa longueur s'intègre parfaitement dans un octet! :RÉ

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}

C'est une fonction, passez-lui les caractères de début, les caractères de fin, puis le texte.

Ry-
la source
Votre propre commentaire d'édition a été utilisé contre vous. : D
Poignée de porte
@ Doorknob: Je… je pensais que je n'avais jamais fait ça. D: Je suis vraiment désolée. (Vous
chassiez
@Doorknob: Et merci de me le rappeler; raccourci :)
Ry-
Non, je ne chassais pas, je suis juste tombé sur cette question, mais j'ai décidé de le faire, et j'ai trouvé ceci : O: P
Poignée de porte
2

Python - 162 caractères

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
la source
Notez que la tâche demande que les deux jeux de parenthèses fassent partie de l'entrée, non codés en dur.
Joey
@Joey a noté, je vais résoudre ce problème dans un certain temps. Merci
Juan
2

Python 2.7.X - 136 caractères

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

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

Résultat résultant:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)
arrdem
la source
Avez-vous besoin des espaces après les printdéclarations?
Zacharý
2

C - 213 209

Je déteste les erreurs stupides ...>. <

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

Lit les parens à gauche du premier argument de ligne de commande, les parens à droite du deuxième argument et les entrées pour mettre en retrait sur stdin.

Assez imprimé et commenté:

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);
  }
}
Luciole
la source
1

C ( 159 225 caractères)

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

Cela m'a coûté 66 caractères supplémentaires juste pour corriger le bug avec les lignes vides :( Franchement, j'ai besoin d'une nouvelle approche, mais je l'appellerai un jour pour l'instant.

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

Une approche plutôt rapide et sale. Il a un bug de produire des lignes vides entre parenthèses fermantes consécutives, mais sinon il fait le travail (ou du moins je pense). Je vais le revoir pour une solution meilleure et plus propre, cette semaine.

char * b est le jeu de parenthèses ouvrantes, char * e est le jeu de parenthèses fermantes et char * s est la chaîne d'entrée.

Harry K.
la source
1

Perl - 69 octets

TMTOWTDI rend le code simple

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge
Hojung Youn
la source
3
Vous êtes censé prendre les parenthèses en entrée, pas les coder en dur.
Gareth
1

Scala (2.9), 211 caractères

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
la source
1

Perl - 89 85 octets

Une version de la réponse de Hojung Youn qui accepte les caractères de bloc via deux arguments.

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

Appelé comme:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'
Sorpigal
la source
Très beau concept, @Hojung et Sorpigal. C'est un peu fragile cependant. Par exemple, permutez les] et} dans l'argument close-paren, et le] ferme la classe de caractères, conduisant à une erreur de paren inégalée. De même, supposons que l'ensemble ouvert commence par ^, peut-être pour correspondre à v dans l'ensemble proche; vous obtiendrez le complément de la classe [$ a] prévue. C'est pourquoi j'ai utilisé \ Q ... \ E dans ma réponse. Le \ w + pour les caractères non-paren fonctionne pour l'exemple, mais qu'en est-il de l'entrée comme 'x (foo-bar) y' '(' ')'? Bien sûr, il n'est pas clair que le code doit gérer quelque chose comme ça.
DCharness
1

Python3, 184 182 caractères

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

Exemple:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}
Alexandru
la source
heinrich5991 a suggéré de sauvegarder deux caractères en changeant la deuxième ligne en_,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}

Vous pouvez enregistrer le script dans un fichier indent.groovy et l'essayer avec:
groovy indent.groovy "abc {xyz {text [note {comment (t {ex} t) abc}]}}" "{[(" ") ]} "

Marco Martinelli
la source
J'ai essayé dans groovy pendant une heure avant de voir votre réponse, j'ai utilisé une approche similaire, mais la mienne est beaucoup plus longue que la vôtre, donc je ne prendrai même pas la peine de poster .. Bon travail! :)
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

Une version non golfée du programme:

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

Les arguments du programme sont (dans l'ordre): les parenthèses ouvrantes, les parenthèses fermantes et le texte à mettre en retrait.

Exemple ($ est l'invite de ligne de commande):

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

a besoin d'une chaîne terminée par null pour la vérification des limites (sinon, il if(*s)faut la changer en if(s.length))

monstre à cliquet
la source
Notez que la tâche demande que les deux jeux de parenthèses fassent partie de l'entrée, non codés en dur.
Joey
0

Java

Non codegolf version! En supposant que nous ayons cette version de split () qui inclut les délimitations,

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
la source
2
StringUtilsne fait pas partie du JDK standard.
st0le
0

C 284 Caractères non blancs

Je ne suis pas fan d'obscurcissement mais bon ...

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

Utilisation: ./program start_brackets end_brackets string_to_parse

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

La fonction prend la chaîne, ouvrant les délimiteurs, terminant les délimiteurs comme arguments.

migimaru
la source
0

C, 256

Paramètres:

  • e est le caractère final,
  • n est l'indentation,
  • b les supports d'ouverture,
  • d les crochets de fermeture.

J'ai cassé le code pour éviter la barre de défilement horizontale.

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

Le programme complet comprend 363 caractères.

#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
la source
0

VB.net (? C)

Le langage n'est pas adapté au golf de code, j'ai donc utilisé une approche peu commune. Utilisation d'un écouteur de trace pour sortir vers la console.

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

Utilise les arguments de ligne de commande pour l'entrée

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

Powershell, 146 octets

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}

Explication non golfée

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
la source
0

C, 181 caractères

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

À peu près l'approche la plus simple imaginable. Itérer à travers la chaîne (v [3]), si c'est une accolade gauche (comme défini dans v [1]), augmenter le niveau de retrait, si c'est une accolade droite (comme défini dans v [2]), diminuer le niveau de retrait .

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

Pas très agréable, mais une solution .. une ligne vide peut apparaître avant / après selon que l'entrée commence / se termine par des parenthèses.

Avec la nouvelle restriction, cette approche est presque inutile pour le golf.

esneider
la source
N'indent pas suffisamment les parenthèses ouvrantes et génère des lignes vides entre les fermetures consécutives.
Joey
@joey corrigé, merci pour les commentaires!
esneider
Il code toujours en dur les parenthèses alors qu'elles devraient faire partie de l'entrée. Actuellement, toutes les réponses ne sont pas conformes à la spécification.
Joey