นี่คือรูปแบบของตัวแยกวิเคราะห์ HTML ที่ให้อภัย แทนการแยกวิเคราะห์ HTML และการแยกแอตทริบิวต์ในโค้ดกอล์ฟนี้ตัวแยกวิเคราะห์แท็กจะง่าย
เขียนฟังก์ชั่นที่แยกวิเคราะห์โครงสร้างแท็กและส่งกลับแบบฟอร์มพาเรนต์ แท็กเปิดประกอบด้วยตัวอักษรตัวเล็กหนึ่งตัวและแท็กปิดประกอบด้วยตัวอักษรตัวใหญ่หนึ่งตัว ยกตัวอย่างเช่นการaAbaAB
แยกวิเคราะห์ลงไป(a)(b(a))
หรือใน <a></a><b><a></a></b>
HTML, แน่นอนแท็กสามารถอยู่ในการวางตำแหน่งและรัง
ต้องจัดการแท็กที่ปิด "ก่อนกำหนด" ยกตัวอย่างเช่นในabcA
การA
ปิดนอกสุดดังนั้นจึงแยกออกเป็นa
(a(b(c)))
ปิดแท็กพิเศษจะถูกละเว้นเพียง: แยกวิเคราะห์ลงในaAB
(a)
แท็กที่ทับซ้อนกันจะไม่ถูกจัดการ ตัวอย่างเช่นabAB
แยกวิเคราะห์(a(b))
ไม่ใช่(a(b))(b)
ตามกฎก่อนหน้าของแท็กปิดพิเศษ ( abAB
-> abA
( (a(b))
) + B
(พิเศษ))
สมมติว่าไม่มีช่องว่างและอักขระผิดกฎหมายอื่น ๆ ในอินพุต
คุณไม่ได้รับอนุญาตให้ใช้ห้องสมุดใด ๆ
นี่คือการดำเนินการอ้างอิงและรายการกรณีทดสอบ:
#!/usr/bin/python
def pars(inpu):
outp = ""
stac = []
i = 0
for x in inpu:
lowr = x.lower()
if x == lowr:
stac.append(x)
outp += "(" + x
i = i + 1
else:
while len(stac) > 1 and stac[len(stac) - 1] != lowr:
outp += ")"
stac.pop()
i = i - 1
if len(stac) > 0:
outp += ")"
stac.pop()
i = i - 1
outp += ")" * i
return outp
tests = [
("aAaAbB", "(a)(a)(b)"),
("abBcdDCA", "(a(b)(c(d)))"),
("bisSsIB", "(b(i(s)(s)))"),
("aAabc", "(a)(a(b(c)))"),
("abcdDA", "(a(b(c(d))))"),
("abcAaA", "(a(b(c)))(a)"),
("acAC", "(a(c))"),
("ABCDEFG", ""),
("AbcBCabA", "(b(c))(a(b))")
]
for case, expe in tests:
actu = pars(case)
print "%s: C: [%s] E: [%s] A: [%s]" % (["FAIL", "PASS"][expe == actu], case, expe, actu)
รหัสที่สั้นที่สุดชนะ
AbcBCabA
(ควรแยกวิเคราะห์(b(c))(a(b))
รหัสของฉันอาจสั้นกว่านี้ยกเว้นกรณีนี้