Đây là mô hình của trình phân tích cú pháp HTML dễ tha thứ. Thay vì phân tích cú pháp HTML và trích xuất các thuộc tính, trong mã golf này, trình phân tích cú pháp thẻ sẽ đơn giản.
Viết hàm phân tích cấu trúc thẻ và trả về dạng cha mẹ của nó. Thẻ mở bao gồm một chữ cái viết thường và thẻ đóng bao gồm một chữ cái viết hoa. Ví dụ: aAbaAB
phân tích cú pháp thành (a)(b(a))
hoặc trong HTML , <a></a><b><a></a></b>
. Tất nhiên, các thẻ có thể ở vị trí kề nhau và lồng nhau.
Các thẻ đóng "sớm" phải được xử lý. Ví dụ, trong abcA
, A
đóng ngoài cùng a
, vì vậy nó phân tích thành (a(b(c)))
.
Các thẻ đóng thêm chỉ đơn giản là bị bỏ qua: aAB
phân tích thành (a)
.
Thẻ chồng chéo KHÔNG được xử lý. Ví dụ: abAB
phân tích cú pháp thành (a(b))
, không (a(b))(b)
, theo quy tắc trước đó của các thẻ đóng thêm ( abAB
-> abA
( (a(b))
) + B
(thêm)).
Giả sử không có khoảng trắng và các ký tự không hợp lệ khác trong đầu vào.
Bạn không được phép sử dụng bất kỳ thư viện.
Dưới đây là một triển khai tham khảo và một danh sách các trường hợp thử nghiệm:
#!/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)
Mã ngắn nhất sẽ thắng.
AbcBCabA
(nên phân tích thành (b(c))(a(b))
. Mã của tôi có thể ngắn hơn ngoại trừ trường hợp này.