Reindent Java / C / C ++ / etc. kode

10

Tulis program yang menambah atau menghilangkan spasi untuk memformat kode dengan baik. Aturan untuk seperti apa kode itu ketika Anda selesai:

  • Baris tidak boleh mengandung lebih dari satu {dan }.
  • A {harus selalu menjadi hal terakhir pada sebuah baris.
  • A }harus selalu menjadi satu - satunya hal dalam satu baris (selain spasi putih yang muncul sebelumnya).
  • Jumlah spasi putih di depan setiap baris harus merupakan kelipatan tetap dari jumlah sarang saat ini. (Anda dapat menggunakan jumlah lekukan yang Anda inginkan, asalkan tidak berubah.)
  • Tidak ada spasi putih harus dimasukkan atau dihapus yang tidak berkontribusi untuk memenuhi salah satu aturan ini.

Hitungan bersarang untuk baris pertama adalah 0. Hitungan bersarang dari baris lain adalah hitungan bersarang dari baris sebelumnya, ditambah satu jika baris sebelumnya berisi {, minus satu jika baris saat ini berisi a }.

{dan }di dalam string literal dan komentar tidak dihitung dalam aturan di atas. Literal string adalah teks yang diapit dengan tanda kutip tunggal atau ganda, di mana tanda kutip tunggal atau ganda dengan jumlah garis miring terbalik segera sebelum mereka tidak ditafsirkan sebagai akhir string string. Komentar adalah teks yang dilampirkan dalam /*dan */, atau teks pergi dari //ke akhir baris. Dalam beberapa baris penanda mulai komentar, hanya yang pertama yang diperhitungkan. Komentar tidak diuraikan dalam string literal.

Contohnya

    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
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

Jawaban:

6

JavaScript (ES6), 376 373 378 393 byte

Ini adalah ... tantangannya ...

Beri tahu saya jika ada yang salah dengan hasilnya, meskipun saya tidak dapat menemukan apa pun tidak dapat menemukan lebih banyak.

Versi tidak disatukan

Saya memasukkan kode ini ketika saya menulisnya, jadi mari kita lihat bagaimana kelanjutannya ...

Produksi ETH
sumber
terlihat bagus untuk saya
tbodt
Saya memasukkan kode tersebut ketika saya menulisnya, itu berarti Anda adalah pegolf sejati ...
Erik the Outgolfer
4

JavaScript (ES6), 260 259 byte

Parsing karakter input dengan karakter. Menggunakan lekukan 4-ruang.

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)

Ini masih WIP dan pada dasarnya diuji hanya terhadap contoh yang diberikan. Jika Anda menemukan bug, beri tahu saya di komentar.

Keadaan pengurai sepenuhnya dijelaskan oleh variabel berikut:

  • d → kedalaman sarang saat ini
  • i → flag memberitahukan bahwa kita berada 'di dalam' kode (yaitu setelah spasi terdepan dari baris)
  • l → string string literal
  • c → blokir bendera komentar
  • e → bendera komentar baris

Versi indentasi wajib

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
)

Uji kasus

Arnauld
sumber