Reindent Java / C / C ++ / etc. Code

10

Schreiben Sie ein Programm, das Leerzeichen hinzufügt oder entfernt, um Code gut zu formatieren. Regeln, wie der Code aussehen soll, wenn Sie fertig sind:

  • Keine Zeile sollte mehr als eine von {und enthalten }.
  • A {sollte immer das Letzte in einer Zeile sein.
  • A }sollte immer das einzige in einer Zeile sein (außer Leerzeichen, die davor stehen).
  • Die Anzahl der Leerzeichen vor jeder Zeile sollte ein festes Vielfaches der aktuellen Verschachtelungszahl sein. (Sie können beliebig viele Einrückungen verwenden, solange sich dies nicht ändert.)
  • Es sollten keine Leerzeichen eingefügt oder entfernt werden, die nicht zur Erfüllung einer dieser Regeln beitragen.

Die Verschachtelungsanzahl für die erste Zeile ist 0. Die Verschachtelungsanzahl einer anderen Zeile ist die Verschachtelungsanzahl der vorherigen Zeile plus eins, wenn die vorherige Zeile a enthält {, minus eins, wenn die aktuelle Zeile a enthält }.

{und }innerhalb von String-Literalen und Kommentaren zählen in den obigen Regeln nicht. Ein Zeichenfolgenliteral ist Text in einfachen oder doppelten Anführungszeichen, wobei einfache oder doppelte Anführungszeichen mit einer ungeraden Anzahl von Backslashes unmittelbar davor nicht als Ende des Zeichenfolgenliterals interpretiert werden. Ein Kommentar ist Text, der in /*und eingeschlossen ist */, oder Text, der //bis zum Ende der Zeile reicht. In einer Zeile mit mehreren Kommentar-Startmarkierungen zählt nur die erste. Kommentare werden nicht in String-Literalen analysiert.

Beispiele

    main() {printf("Hello!"); // I don't care about the world...
        }

becomes:

main() {
    printf("Hello!"); // I don't care about the world...
}




int main(){
    puts("a");
        puts("b");
}

becomes:

int main(){
    puts("a");
    puts("b");
}


main()
{ printf("{"); /* }
} */
     printf("}//}"); ///*
    }

becomes:

main()
{
    printf("{"); /* }
} */
    printf("}//}"); ///*
}


int test[] = {1, 2, 3};

becomes:

int test[] = {
    1, 2, 3
}
;
tbodt
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Dennis

Antworten:

6

JavaScript (ES6), 376 373 378 393 Byte

Das war ... eine ziemliche Herausforderung ...

Lassen Sie mich wissen, wenn etwas mit der Ausgabe nicht stimmt, obwohl ich nichts finden konnte, kann ich nichts mehr finden.

Ungolfed Version

Ich habe den Code so gespielt, wie ich ihn geschrieben habe, also mal sehen, wie das geht ...

ETH-Produktionen
quelle
sieht gut aus für mich
tbodt
Ich habe den Code so gespielt, wie ich ihn geschrieben habe , was bedeutet, dass Sie ein echter Golfer sind ...
Erik der Outgolfer
4

JavaScript (ES6), 260 259 Byte

Analysiert die Eingabe zeichenweise. Verwendet 4-Leerzeichen-Einrückung.

s=>s.replace(/[^]/g,(x,n)=>(p=s[n-1],a=!l&!c&!e,l|x!='/'?a&x=='*'&p=='/'?c=x:!c&!e&x=='"'?(l^=1,x):x==`
`?(i=e=0,x):a&x=='}'?d--&&i?`
`+x:i=x:a&x=='{'?s[i=!++d,n+1]==`
`?x:x+`
`:i?x:x==' '?'':' '.repeat(!c*d*4,i=1)+x:p==x?e=x:!e&p=='*'?(c=0,x):x),d=i=l=c=e=0)

Dies ist immer noch ein WIP und wurde grundsätzlich nur anhand der bereitgestellten Beispiele getestet. Wenn Sie einen Fehler finden, lassen Sie es mich bitte in den Kommentaren wissen.

Der Status des Parsers wird vollständig durch die folgenden Variablen beschrieben:

  • d → aktuelle Verschachtelungstiefe
  • i → Flag, das angibt, dass wir uns 'innerhalb' des Codes befinden (dh nach den führenden Leerzeichen der Zeile)
  • l → String-Literal-Flag
  • c → Kommentar-Flag blockieren
  • e → Zeilenkommentar-Flag

Obligatorisch eingerückte Version

s => s.replace(
  /[^]/g,
  (x, n) => (
    p = s[n - 1],
    a = !l & !c & !e,
    l | x != '/' ?
      a & x == '*' & p == '/' ?
        c = x
      :
        !c & !e & x == '"' ?
          (l ^= 1, x)
        :
          x == `\n` ?
            (i = e = 0, x)
          :
            a & x == '}' ?
              d-- && i ? `\n` + x : i = x
            :
              a & x == '{' ?
                s[i = !++d, n + 1] == `\n` ? x : x + `\n`
              :
                i ?
                  x
                :
                  x == ' ' ? '' : ' '.repeat(!c * d * 4, i = 1) + x
    :
      p == x ?
        e = x
      :
        !e & p == '*' ? (c = 0, x) : x
  ),
  d = i = l = c = e = 0
)

Testfälle

Arnauld
quelle