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 aAbaAB
ayrışı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
, A
en dıştaki kapanır a
, bu yüzden içine ayrılır (a(b(c)))
.
Ekstra kapatma etiketleri dikkate alınmaz: aAB
içine ayrılır (a)
.
Çakışan etiketler KULLANILMAZ. Örneğin, abAB
iç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))