Ceci est un modèle d'un analyseur HTML indulgent. Au lieu d'analyser le HTML et d'extraire les attributs, dans ce code golf, l'analyseur de balises sera simple.
Écrivez une fonction qui analyse une structure de balises et renvoie sa forme entre parenthèses. Une balise d'ouverture se compose d'une lettre minuscule et une balise de fermeture se compose d'une lettre majuscule. Par exemple, aAbaAB
parse dans (a)(b(a))
ou en HTML, <a></a><b><a></a></b>
. Bien sûr, les balises peuvent être juxtaposées et imbriquées.
Les balises fermées "prématurément" doivent être gérées. Par exemple, dans abcA
, le A
ferme le plus à l'extérieur a
, de sorte qu'il analyse (a(b(c)))
.
Les balises de fermeture supplémentaires sont simplement ignorées: elles sont aAB
analysées (a)
.
Les balises qui se chevauchent ne sont PAS gérées. Par exemple, abAB
analyse (a(b))
, non (a(b))(b)
, par la règle précédente des balises de fermeture supplémentaires ( abAB
-> abA
( (a(b))
) + B
(extra)).
En supposant qu'il n'y ait pas d'espaces blancs et d'autres caractères illégaux dans l'entrée.
Vous n'êtes pas autorisé à utiliser une bibliothèque.
Voici une implémentation de référence et une liste de cas de 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)
Le code le plus court gagne.
AbcBCabA
(devrait analyser comme (b(c))(a(b))
. Mon code aurait pu être plus court sauf dans ce cas.