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.


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.


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

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

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.


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

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
)

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

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.


1

Perl - 69 octets

TMTOWTDI rend le code simple

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

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

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}]}}' '[{(<' ']})>'

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

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}]}}" "{[(" ") ]} "


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

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


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

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


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.


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

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.

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)

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 .


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.