Это модель прощающего анализатора HTML. Вместо синтаксического анализа HTML и извлечения атрибутов в этом кодовом гольфе анализатор тегов будет простым.
Напишите функцию, которая анализирует структуру тегов и возвращает ее заключенную в скобки форму. Открывающий тег состоит из одной строчной буквы, а закрывающий тег состоит из одной заглавной буквы. Например, aAbaAB
анализирует (a)(b(a))
или в HTML <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))
. Мой код мог бы быть короче, за исключением этого случая.Ответы:
Golfscript, 54 символа
тесты
источник
Haskell, 111 символов
Этот красивый гольф для Хаскелла. Забавная особенность: стек и накопленный вывод хранятся в одной строке!
Тестовые случаи:
@
шаблон, как предложено FUZxxlисточник
Машинный код Z80 для TI-83 +, 41 байт
Это реализация в шестнадцатеричном машинном коде для процессора z80, работающего на TI-83 +.
11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9
XXXX (3–6 включительно) - это 16-битный адрес анализируемой строки минус 1 байт.
Закодировано в Z80-ASCII:
¹XX≤¯•⟙8𝑭o↥>(ˣïÑ}ˣïÑ≠á↑γ∊>)ˣïÑ≠Ì⬆︎E𝑤↥!₄L↑Φ
(Приблизительно, потому что калькуляторы TI имеют свой собственный набор символов.)
ПРИМЕЧАНИЕ, ЧТО
AsmPrgm
НЕ ВКЛЮЧЕНО В ВЫШЕисточник
Windows PowerShell, 142
146147152156169Некоторые вещи, на которые стоит обратить внимание: это просто блок скрипта. При необходимости его можно присвоить переменной или дать имя функции. Вы также можете запустить его, поставив
.
или&
перед ним и аргументы в конце. Использует последний пробел для завершения незакрытых тегов.Проходит все тесты. Тестовый скрипт:
источник
Python -
114113153192174159 символовЗлоупотребляет синтаксическим анализатором отступов в python, чтобы использовать один пробел для полной вкладки, пять для двух вкладок.
Редактировать 1 - сохранить ненужный пробел в функции range ()
Edit 2 - исправлено, чтобы иметь дело с неправильными грамматиками разбора, неопределенными тегами.
Редактировать 3 - исправлена ошибка, из-за которой "неправильные" парсинги могли генерироваться неоднозначностью в дереве тегов. Реализована основанная на стеке стратегия, а не счетчик.
Редактировать 4 - переименовать s.find в o, чтобы не сохранять символы, используемые для его повторного вызова. сделал то же самое для f.lower.
Редактировать 5 - добавлен хак пробел / вкладка, сохранив три символа.
Редактировать 6 - исключить цикл в пользу ")" * d.
источник
ord(f)...
вы можете использовать'@'<f<'\\'
Если вам не нужно проверять,'\\'
вы можете использовать']'
вместоif ...:s+=")";c-=1
else:s+="("+f;c+=1
for i in range(d):s+=")"
можно переписать какs+=")"*d
. И у вас есть 174 символа.