Reindent Java / C / C ++ / ecc. codice


10

Scrivi un programma che aggiunge o rimuove spazi bianchi per formattare il codice in modo corretto. Regole per l'aspetto del codice al termine:

  • Nessuna riga deve contenere più di una di {e }.
  • A {dovrebbe essere sempre l'ultima cosa su una linea.
  • A }dovrebbe essere sempre l' unica cosa su una linea (oltre agli spazi bianchi che la precedono).
  • La quantità di spazio bianco davanti a ciascuna riga dovrebbe essere un multiplo fisso del conteggio di nidificazione corrente. (È possibile utilizzare qualsiasi quantità di rientro desiderata, purché non cambi.)
  • Nessuno spazio bianco deve essere inserito o rimosso che non contribuisce a soddisfare una di queste regole.

Il conteggio di annidamento per la prima riga è 0. Il conteggio di annidamento di qualsiasi altra riga è il conteggio di annidamento della riga precedente, più uno se la riga precedente contiene a {, meno uno se la riga corrente contiene a }.

{e }all'interno di stringhe letterali e commenti non contano nelle regole precedenti. Un valore letterale stringa è il testo racchiuso tra virgolette singole o doppie, in cui le virgolette singole o doppie con un numero dispari di barre rovesciate immediatamente prima di esse non vengono interpretate come la fine del valore letterale stringa. Un commento è il testo racchiuso tra /*e */e il testo che va dalla //fine della riga. In una riga più marcatori di inizio commenti, conta solo il primo. I commenti non vengono analizzati all'interno dei valori letterali delle stringhe.

Esempi

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

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

Risposte:


6

JavaScript (ES6), 376 373 378 393 byte

Questa era ... piuttosto la sfida ...

Fammi sapere se c'è qualcosa di sbagliato nell'output, anche se non sono riuscito a trovare nulla, non riesco a trovare altro.

Versione Ungolfed

Ho scritto il codice mentre lo scrivevo, quindi vediamo come va ...


mi
sta

Ho giocato a golf con il codice mentre lo scrivevo, il che significa che sei un vero golfista ...
Erik the Outgolfer,

4

JavaScript (ES6), 260 259 byte

Analizza il carattere di input per carattere. Utilizza il rientro a 4 spazi.

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)

Questo è ancora un WIP ed è stato sostanzialmente testato solo sulla base degli esempi forniti. Se trovi qualche bug, per favore fammi sapere nei commenti.

Lo stato del parser è completamente descritto dalle seguenti variabili:

  • d → profondità di annidamento attuale
  • i → flag che indica che ci troviamo all'interno del codice (ovvero dopo gli spazi iniziali della linea)
  • l → flag letterale stringa
  • c → blocca flag di commento
  • e → flag commento riga

Versione obbligatoria indentata

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
)

Casi test

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.