Bu, affedici bir HTML ayrıştırıcısının bir modelidir. HTML'yi ayrıştırmak ve öznitelikleri ayıklamak yerine, bu kod golfünde, etiket ayrıştırıcı basit olacaktır.
Bir etiket yapısını ayrıştıran ve parantez içindeki formunu döndüren bir işlev yazın. Açılış etiketi bir küçük harf ve kapanış etiketi bir büyük harf içerir. Örneğin, HTML'de veya HTML'de aAbaABayrışır . Tabii ki, etiketler yan yana ve yuvada olabilir.(a)(b(a))<a></a><b><a></a></b>
"Zamanından önce" kapalı etiketler kullanılmalıdır. Örneğin, içinde abcA, Aen dıştaki kapanır a, bu yüzden içine ayrılır (a(b(c))).
Ekstra kapatma etiketleri dikkate alınmaz: aABiçine ayrılır (a).
Çakışan etiketler KULLANILMAZ. Örneğin, abABiçine ayrıştırır (a(b)), değil (a(b))(b), önceki ekstra kapanış etiketleri üstünlüğü ile ( abAB-> abA( (a(b))) + B(ekstra)).
Girdide boşluk veya diğer geçersiz karakterler olduğu varsayılır.
Herhangi bir kütüphane kullanma izniniz yok.
İşte bir referans uygulaması ve test senaryolarının bir listesi:
#!/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)
En kısa kod kazanır.
AbcBCabA(b(c))(a(b))