ใส่ใหม่ Java / C / C ++ / ฯลฯ รหัส


10

เขียนโปรแกรมที่เพิ่มหรือลบช่องว่างเพื่อจัดรูปแบบโค้ดได้อย่างดี กฎสำหรับสิ่งที่รหัสควรมีลักษณะเมื่อคุณทำเสร็จ

  • ไม่มีเส้นควรมีมากกว่าหนึ่งและ{}
  • A {ควรเป็นสิ่งสุดท้ายในบรรทัดเสมอ
  • A }ควรเป็นสิ่งเดียวในบรรทัดเสมอ (นอกเหนือจากช่องว่างที่มาก่อนหน้า)
  • จำนวนของช่องว่างด้านหน้าของแต่ละบรรทัดควรเป็นจำนวนคงที่ของจำนวนการซ้อนปัจจุบัน (คุณสามารถใช้การเยื้องในจำนวนที่ต้องการตราบใดที่มันไม่เปลี่ยนแปลง)
  • ไม่ควรใส่หรือลบช่องว่างที่ไม่มีส่วนในการทำให้กฎเหล่านี้เป็นที่พอใจ

นับรังบรรทัดแรกเป็น 0 นับการทำรังของสายอื่น ๆ คือการนับการทำรังของบรรทัดก่อนหน้าบวกหนึ่งถ้าบรรทัดก่อนหน้ามีลบหนึ่งถ้าบรรทัดปัจจุบันมี{}

{และ}ภายในสตริงตัวอักษรและความคิดเห็นไม่นับในกฎข้างต้น สตริงตัวอักษรเป็นข้อความที่อยู่ในเครื่องหมายคำพูดเดี่ยวหรือคู่โดยที่เครื่องหมายคำพูดเดี่ยวหรือคู่ที่มีจำนวนแบ็กสแลชแปลก ๆ ก่อนที่พวกเขาจะไม่ถูกตีความว่าเป็นจุดสิ้นสุดของตัวอักษรสตริง ความคิดเห็นคือข้อความที่อยู่ใน/*และ*/หรือข้อความที่ไปจาก//ถึงจุดสิ้นสุดของบรรทัด ในเครื่องหมายเริ่มต้นความคิดเห็นหลายบรรทัดบรรทัดเดียวเท่านั้นที่นับได้ ความคิดเห็นจะไม่ถูกแยกวิเคราะห์ภายในตัวอักษรสตริง

ตัวอย่าง

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

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

คำตอบ:


6

JavaScript (ES6), 376 373 378 393 ไบต์

นี่คือ ... ค่อนข้างท้าทาย ...

แจ้งให้เราทราบหากมีสิ่งผิดปกติกับผลลัพธ์แม้ว่าฉันจะไม่พบสิ่งใดไม่สามารถหาอะไรเพิ่มเติม

เวอร์ชันที่ไม่ดี

ฉันเล่นกอล์ฟตามที่เขียนไว้ดังนั้นมาดูกันว่ามันจะเป็นอย่างไร


ดูดีกับฉัน
tbodt

ผมแข็งแรงเล่นกอล์ฟรหัสเป็นฉันเขียนมันหมายความว่าคุณจะเป็นนักกอล์ฟที่จริง ...
เอริก Outgolfer

4

JavaScript (ES6), 260 259 ไบต์

แยกวิเคราะห์อักขระที่ป้อนโดยอักขระ ใช้การเว้นวรรค 4 ช่อง

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)

สิ่งนี้ยังคงเป็น WIP และทดสอบกับตัวอย่างที่ให้มาโดยทั่วไปเท่านั้น หากคุณพบข้อผิดพลาดใด ๆ โปรดแจ้งให้เราทราบในความคิดเห็น

สถานะของ parser ถูกอธิบายอย่างสมบูรณ์โดยตัวแปรต่อไปนี้:

  • d →ความลึกการซ้อนปัจจุบัน
  • i →ธงบอกว่าเราอยู่ในโค้ด 'ข้างใน' (เช่นหลังจากช่องว่างนำของบรรทัด)
  • l →ธงตัวอักษรสตริง
  • c →บล็อกการตั้งค่าสถานะความคิดเห็น
  • e →ธงความคิดเห็นสาย

รุ่นเว้าที่มีภาระผูกพัน

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
)

กรณีทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.