Reindent Java / C / C ++ / vv. mã


10

Viết chương trình thêm hoặc xóa khoảng trắng để định dạng mã độc đáo. Các quy tắc cho mã sẽ trông như thế nào khi bạn hoàn thành:

  • Không có dòng nào nên chứa nhiều hơn một {}.
  • A {nên luôn luôn là điều cuối cùng trên một dòng.
  • A }phải luôn là thứ duy nhất trên một dòng (ngoài khoảng trắng xuất hiện trước nó).
  • Số lượng khoảng trắng phía trước mỗi dòng phải là bội số cố định của số lượng lồng hiện tại. (Bạn có thể sử dụng bất kỳ số lượng thụt nào bạn muốn, miễn là nó không thay đổi.)
  • Không có khoảng trắng nào được chèn hoặc xóa mà không góp phần đáp ứng một trong các quy tắc này.

Số lượng lồng cho dòng đầu tiên là 0. Số lượng lồng của bất kỳ dòng nào khác là số lượng lồng của dòng trước đó, cộng với một nếu dòng trước đó chứa a {, trừ một nếu dòng hiện tại chứa a }.

{}bên trong chuỗi ký tự và bình luận không được tính trong các quy tắc trên. Một chuỗi ký tự là văn bản được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép, trong đó dấu ngoặc đơn hoặc dấu ngoặc kép có số dấu gạch chéo ngược ngay lập tức trước khi chúng không được hiểu là phần cuối của chuỗi ký tự. Một bình luận là văn bản kèm theo /**/, hoặc văn bản đi từ //cuối dòng. Trong một dòng nhiều đánh dấu bắt đầu nhận xét, chỉ có một đánh dấu đầu tiên. Nhận xét không được phân tích cú pháp bên trong chuỗi ký tự.

Ví dụ

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

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Câu trả lời:


6

JavaScript (ES6), 376 373 378 393 byte

Đây là ... khá là thách thức ...

Hãy cho tôi biết nếu có bất cứ điều gì sai với đầu ra, mặc dù tôi không thể tìm thấy bất cứ điều gì không thể tìm thấy bất cứ điều gì hơn.

Phiên bản ung dung

Tôi đã viết mã khi tôi viết nó, vì vậy hãy xem điều này diễn ra như thế nào ...


có vẻ tốt với tôi
tbodt

Tôi đã đánh mã khi tôi viết nó có nghĩa là bạn là một tay golf thực thụ ...
Erik the Outgolfer

4

JavaScript (ES6), 260 259 byte

Phân tích ký tự đầu vào theo ký tự. Sử dụng thụt lề 4 không gian.

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)

Đây vẫn là một WIP và về cơ bản chỉ được thử nghiệm đối với các ví dụ được cung cấp. Nếu bạn tìm thấy bất kỳ lỗi, xin vui lòng cho tôi biết trong các ý kiến.

Trạng thái của trình phân tích cú pháp được mô tả đầy đủ bởi các biến sau:

  • d → độ sâu làm tổ hiện tại
  • i → cờ cho biết rằng chúng tôi được đặt 'bên trong' mã (tức là sau khoảng trắng hàng đầu của dòng)
  • l → cờ chữ
  • c → chặn bình luận cờ
  • e → cờ bình luận dòng

Phiên bản thụt lề bắt buộc

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
)

Các trường hợp thử nghiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.