Це модель прощаючого HTML-аналізатора. Замість розбору HTML та вилучення атрибутів, у цьому коді гольф парсер тегів буде простим.
Напишіть функцію, яка аналізує структуру тегів та повертає її скобку. Вступний тег складається з однієї малої літери, а завершальний тег складається з однієї великої літери. Наприклад, aAbaABрозбирає в (a)(b(a))або в HTML, <a></a><b><a></a></b>. Звичайно, мітки можуть знаходитись у поєднанні та гнізді.
Закриті теги повинні бути оброблені. Наприклад, в 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)). Мій код міг бути коротшим, за винятком цього випадку.