Простий аналог тегів


9

Це модель прощаючого 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)

Найкоротший код виграє.


як і будь-які інші коди-гольфи, стандартна бібліотека дозволена
Мінг-Тан

немає обмеження по довжині та рівню гніздування
Ming-Tang

4
Вам слід додати тестовий випадок для введення даних, що веде із закриваючим тегом, наприклад AbcBCabA(слід розібрати як (b(c))(a(b)). Мій код міг бути коротшим, за винятком цього випадку.
MtnViewMark

Відповіді:


1

Гольфскрипт, 54 символи

{[]:|\{.96>{.|+:|;40\}{32+|?).')'*\|>:|;}if}%|,')'*}:$

Тести

;["aAaAbB" "abBcdDCA" "bisSsIB" "aAabc" "abcdDA" "abcAaA" "acAC" "aAB" "abAB" "AbcBCabA"]{.' '\$n}%

aAaAbBaAaAbB (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))
aAB (a)
abAB (a(b))
AbcBCabA (b(c))(a(b))

6

Haskell, 111 символів

s@(d:z)§c|c>'^'=toEnum(fromEnum c-32):s++'(':[c]|d<'='=s|d==c=z++")"|1<3=(z++")")§c
p=tail.foldl(§)"$".(++"$")

Це досить гольф для Haskell. Fun Fun: Стек і накопичувальний вихід зберігаються в одній і тій же строці!

Тестові приклади:

> runTests 
Pass: aAbaAB parsed correctly as (a)(b(a))
Pass: abcA parsed correctly as (a(b(c)))
Pass: aAB parsed correctly as (a)
Pass: abAB parsed correctly as (a(b))
Pass: aAaAbB parsed correctly as (a)(a)(b)
Pass: abBcdDCA parsed correctly as (a(b)(c(d)))
Pass: bisSsIB parsed correctly as (b(i(s)(s)))
Pass: aAabc parsed correctly as (a)(a(b(c)))
Pass: abcdDA parsed correctly as (a(b(c(d))))
Pass: abcAaA parsed correctly as (a(b(c)))(a)
Pass: acAC parsed correctly as (a(c))
Pass: AbcBCabA parsed correctly as (b(c))(a(b))

  • Редагувати: (113 → 111) використано @схему, запропоновану FUZxxl

Використання @ -pattern для d: z може зберегти дві символи.
FUZxxl

4

Код машини Z80 для TI-83 +, 41 байт

Це реалізація в шістнадцятковий машинний код для процесора z80, що працює на TI-83 +.

11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9

XXXX (3 - 6 включно) - це 16-бітна адреса рядка, який ви розбираєте, мінус 1 байт.

Зашифровано в Z80-ASCII:

¹XX≤¯•⟙8𝑭o↥>(ˣïÑ}ˣïÑ≠á↑γ∊>)ˣïÑ≠Ì⬆︎E𝑤↥!₄L↑Φ

(Орієнтовний, оскільки TI-калькулятори мають свій набір символів.)

Зверніть увагу, що AsmPrgmНЕ ВКЛЮЧЕНО В ПОЗИМО


2

Windows PowerShell, 142 146 147 152 156 169

{$s=''
-join([char[]]"$args "|%{if(90-ge$_){')'*(($x=$s.indexOf("$_".ToLower())+1)+$s.Length*!$x)
$s=$s.substring($x)}else{"($_"
$s="$_$s"}})}

Деякі речі, які слід зазначити: Це лише блок скриптів. Він може бути призначений змінній або присвоїти ім'я функції, якщо це необхідно. Ви також можете запустити його, поставивши .або &перед ним, і аргументи в кінці. Використовує остаточний пробіл для завершення незакритих тегів.

Проходить усі тести. Тестовий сценарій:

$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))")
"function f " + ((gc ./tags.ps1)-join"`n") | iex
$tests | %{
    $result = f $_[0]
    ("FAIL: $($_[0]):$($_[1]) - $result", 'PASS')[$result -ceq $_[1]]
}

2

Пітон - 114 113 153 192 174 159 символів

from sys import *
s="";c=a=argv[1]
for f in a:
 o=c.find;p=f.lower
 if '@'<f<'\\':
\td=o(f)-o(p())
\ts+=")"*d
\tc=(c[:o(p())]+c[o(f)+1:])
 else:s+=("("+f)
print s

Зловживає аналізатором відступів python, щоб використовувати один пробіл для повної вкладки, п'ять для двох вкладок.

Редагувати 1 - зберігається непотрібний простір у функції range ()

Редагувати 2 - виправлено, щоб мати справу з неправильними граматиками розбору, незавершеними тегами.

Редагування 3 - виправлена ​​помилка, завдяки якій "неправильні" синтаксиси можуть бути згенеровані двозначністю у дереві тегів. Реалізовано стратегію на основі стека, а не лічильник.

Edit 4 - перейменований s.find на o, щоб запобігти збереженню символів, які використовуються для його повторного виклику. зробив те ж саме для f.lower.

Редагувати 5 - додано пробіл пробілу / вкладки, заощадивши три символи.

Редагувати 6 - скинув цикл на користь ")" * d.


1
замість того , ord(f)...ви можете використовувати '@'<f<'\\'Якщо вам не потрібно , щоб перевірити '\\'ви можете використовувати ']'замість
gnibbler

1
ви можете використовувати одну вкладку замість 5 пробілів. Так, розмітка коду не може впоратися з цим :(. У вашому випадку просто залиште новий рядок та пробіли взагалі. Наприклад, if ...:s+=")";c-=1іelse:s+="("+f;c+=1
gnibbler

1
for i in range(d):s+=")"можна переписати як s+=")"*d. А у вас 174 символів.
cemper93

@cemper - хороший момент. Я займаюся "_" * 80 цілий день і забуваю про це при гольфі .... Також дякую @gnibbler за пропозиції!
arrdem

На самом деле, я мав в виду , що ви мали 174 символів до того . Тож вам зараз за 159 років.
cemper93
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.