To jest model wybaczającego parsera HTML. Zamiast analizować HTML i wyodrębniać atrybuty, w tym kodzie golfowym parser znaczników będzie prosty.
Napisz funkcję, która przeanalizuje strukturę znaczników i zwróci jej nawiasową formę. Znacznik otwierający składa się z jednej małej litery, a znacznik zamykający składa się z jednej wielkiej litery. Na przykład, aAbaAB
analizuje się (a)(b(a))
, czy w HTML <a></a><b><a></a></b>
. Oczywiście tagi mogą znajdować się w zestawieniu i zagnieżdżeniu.
Należy obsługiwać „przedwcześnie” zamknięte znaczniki. Na przykład w abcA
, A
zamyka skrajne a
, więc analizuje w (a(b(c)))
.
Dodatkowe znaczniki zamykające są po prostu ignorowane: aAB
analizuje w (a)
.
Nakładające się tagi NIE są obsługiwane. Na przykład abAB
analizuje (a(b))
, a nie (a(b))(b)
poprzednią zasadę dodatkowych tagów zamykających ( abAB
-> abA
( (a(b))
) + B
(extra)).
Zakładając, że na wejściu nie ma białych znaków i innych niedozwolonych znaków.
Nie możesz używać żadnej biblioteki.
Oto implementacja referencyjna i lista przypadków testowych:
#!/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)
Najkrótszy kod wygrywa.
AbcBCabA
(powinien parsować jako(b(c))(a(b))
. Mój kod mógłby być krótszy, z wyjątkiem tego przypadku.Odpowiedzi:
Golfscript, 54 znaki
Testy
źródło
Haskell, 111 znaków
Ten jest fajny dla Haskella. Zabawna funkcja: stos i kumulowane wyniki są przechowywane w tym samym łańcuchu!
Przypadki testowe:
@
wzorca sugerowanego przez FUZxxlźródło
Kod maszynowy Z80 dla TI-83 +, 41 bajtów
Jest to implementacja szesnastkowego kodu maszynowego dla procesora Z80 działającego na TI-83 +.
11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9
XXXX (3-6 włącznie) to 16-bitowy adres analizowanego ciągu, minus 1 bajt.
Zakodowane w Z80-ASCII:
¹XX≤¯•⟙8𝑭o↥>(ˣïÑ}ˣïÑ≠á↑γ∊>)ˣïÑ≠Ì⬆︎E𝑤↥!₄L↑Φ
(Przybliżone, ponieważ kalkulatory TI mają swój własny zestaw znaków.)
UWAGA, ŻE
AsmPrgm
NIE JEST WŁĄCZONE POWYŻEJźródło
Windows PowerShell, 142
146147152156169Kilka rzeczy do zapamiętania: To tylko blok skryptu. W razie potrzeby można go przypisać do zmiennej lub nadać nazwę funkcji. Możesz również uruchomić go, umieszczając
.
lub&
przed nim i argumentami na końcu. Używa ostatniego miejsca do zakończenia niezamkniętych znaczników.Przechodzi wszystkie testy. Skrypt testowy:
źródło
Python -
114113153192174159 znakówNadużywa parsera wcięć Pythona, aby użyć jednej spacji dla pełnej tabulacji, pięciu dla dwóch tabulacji.
Edycja 1 - zapisano niepotrzebne miejsce w funkcji range ()
Edycja 2 - naprawiono, aby radzić sobie z niewłaściwymi gramatykami, niezakończonymi tagami.
Edycja 3 - naprawiono błąd, przez który „dwuznaczne” analizy mogły być generowane przez niejednoznaczność w drzewie znaczników. Zaimplementowano strategię opartą na stosie, a nie licznik.
Edytuj 4 - zmieniono nazwę s.find na o, aby zapobiec zapisywaniu znaków używanych do wielokrotnego wywoływania go. zrobił to samo dla F.lower.
Edycja 5 - dodano hakowanie spacji / tabulatorów, oszczędzając trzy znaki.
Edycja 6 - porzuciłem pętlę na korzyść „)” * d.
źródło
ord(f)...
możesz użyć'@'<f<'\\'
Jeśli nie musisz tego sprawdzać'\\'
, możesz użyć']'
zamiastif ...:s+=")";c-=1
else:s+="("+f;c+=1
for i in range(d):s+=")"
można przepisać jakos+=")"*d
. I masz 174 znaki.