Dies ist ein Modell eines verzeihenden HTML-Parsers. Anstatt HTML zu analysieren und Attribute zu extrahieren, ist der Tag-Parser in diesem Code Golf einfach.
Schreiben Sie eine Funktion, die eine Tag-Struktur analysiert und ihre übergeordnete Form zurückgibt. Ein öffnendes Tag besteht aus einem Kleinbuchstaben, und ein schließendes Tag besteht aus einem Großbuchstaben. Zum Beispiel aAbaABparst in (a)(b(a))oder in HTML, <a></a><b><a></a></b>. Natürlich können Tags nebeneinander stehen und verschachtelt sein.
"Vorzeitig" geschlossene Tags müssen behandelt werden. Zum Beispiel in abcAder Aschließt die äußerste a, so dass es in parst (a(b(c))).
Zusätzliche schließende Tags werden einfach ignoriert: aABanalysiert in (a).
Überlappende Tags werden NICHT behandelt. abABAnalysiert beispielsweise (a(b))nicht (a(b))(b)nach der vorherigen Regel für zusätzliche schließende Tags ( abAB-> abA( (a(b))) + B(extra)).
Angenommen, die Eingabe enthält keine Leerzeichen und keine anderen unzulässigen Zeichen.
Sie dürfen keine Bibliothek benutzen.
Hier ist eine Referenzimplementierung und eine Liste von Testfällen:
#!/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)
Der kürzeste Code gewinnt.
AbcBCabA(sollte analysiert werden als (b(c))(a(b)). Mein Code hätte bis auf diesen Fall kürzer sein können.