Это модель прощающего анализатора 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))
. Мой код мог бы быть короче, за исключением этого случая.