Questo è un modello di un parser HTML perdonatore. Invece di analizzare HTML ed estrarre attributi, in questo codice golf, il tag parser sarà semplice.
Scrivi una funzione che analizza una struttura di tag e restituisce la sua forma tra parentesi. Un tag di apertura è costituito da una lettera minuscola e un tag di chiusura è costituito da una lettera maiuscola. Ad esempio, aAbaABanalizza in (a)(b(a)), o in HTML, <a></a><b><a></a></b>. Naturalmente, i tag possono essere in giustapposizione e nidificare.
I tag chiusi "prematuramente" devono essere gestiti. Ad esempio, in abcA, il Achiude il più esterno a, quindi analizza (a(b(c))).
I tag di chiusura extra vengono semplicemente ignorati: aABanalizza in (a).
I tag sovrapposti NON vengono gestiti. Ad esempio, abABanalizza (a(b)), non (a(b))(b), la regola precedente dei tag di chiusura extra ( abAB-> abA( (a(b))) + B(extra)).
Supponendo che non vi siano spazi bianchi e altri caratteri illegali nell'input.
Non è consentito utilizzare alcuna libreria.
Ecco un'implementazione di riferimento e un elenco di casi di test:
#!/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)
Il codice più corto vince.
AbcBCabA(dovrebbe analizzare come (b(c))(a(b)). Il mio codice avrebbe potuto essere più breve, tranne per questo caso.