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

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.