これは寛容なHTMLパーサーのモデルです。HTMLを解析して属性を抽出する代わりに、このコードゴルフでは、タグパーサーは単純になります。
タグ構造を解析し、括弧で囲まれた形式を返す関数を記述します。開始タグは1つの小文字で構成され、終了タグは1つの大文字で構成されます。たとえば、やにaAbaAB
解析さ(a)(b(a))
れます<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))
があります。このコードを除いてコードが短くなっている可能性があります。)などの終了タグでつながる入力のテストケースを追加する必要があります