간단한 태그 파서


9

이것은 용서하는 HTML 파서의 모델입니다. 이 코드 골프에서 HTML을 파싱하고 속성을 추출하는 대신 태그 파서는 간단합니다.

태그 구조를 구문 분석하고 괄호 형식을 반환하는 함수를 작성하십시오. 여는 태그는 하나의 소문자로 구성되고 닫는 태그는 하나의 대문자로 구성됩니다. 예를 들어 aAbaAB(a)(b(a))또는 HTML 로 구문 분석 <a></a><b><a></a></b>합니다. 물론, 태그는 병치 및 중첩 될 수 있습니다.

"조기"닫힌 태그를 처리해야합니다. 예를 들어에서 abcA에서는 A가장 바깥 쪽을 닫으 a므로로 구문 분석됩니다 (a(b(c))).

추가 닫는 태그는 무시 aAB됩니다 (a).

겹치는 태그는 처리되지 않습니다. 예를 들어, 추가 닫는 태그 ( -> ( ) + (extra)) 의 이전 규칙에 따라 not abAB으로 구문 분석 합니다.(a(b))(a(b))(b)abABabA(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

길이와 중첩 수준에 대한 제한 없음
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

하스켈, 111 자

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

하스켈에게는 꽤 골프입니다. 재미있는 기능 : 스택과 누적 출력은 동일한 문자열로 유지됩니다!

테스트 사례 :

> 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에서 제안한 패턴을 사용했습니다.

d : z에 @ 패턴을 사용하면 두 개의 문자가 절약 될 수 있습니다.
FUZxxl

4

TI-83 + 용 Z80 기계 코드, 41 바이트

TI-83 +에서 실행되는 z80 CPU의 16 진 기계 코드 구현입니다.

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

파이썬의 들여 쓰기 파서를 남용하여 전체 탭에 하나의 공간을 사용하고 두 개의 탭에 5를 사용합니다.

편집 1 -range () 함수에 불필요한 공간을 저장했습니다.

편집 2- 부적절한 구문 분석 문법, 종료되지 않은 태그를 처리하도록 수정되었습니다.

편집 3- 태그 트리의 모호성으로 인해 "잘못된"구문 분석이 생성 될 수있는 버그가 수정되었습니다. 카운터가 아닌 스택 기반 전략을 구현했습니다.

편집 4- 반복적으로 호출하는 데 사용되는 문자를 저장하지 않도록 이름을 s.find를 o로 바꿉니다. f.lower에 대해서도 마찬가지입니다.

편집 5- 공백 / 탭 해킹을 추가하여 세 문자를 저장했습니다.

편집 6- ")"* d에 찬성하여 루프를 버렸습니다.


1
대신에 ord(f)...사용할 수 있습니다. '@'<f<'\\'확인이 필요없는 '\\'경우 ']'대신 사용할 수 있습니다.
gnibbler

1
공백 대신 단일 탭을 사용할 수 있습니다. .. SO 코드 마크 업 예를 들어, 귀하의 경우에는 단지 공간을 모두 줄 바꿈에서 휴가를 넣어 :(하지만 그것을 처리 할 수 if ...:s+=")";c-=1else:s+="("+f;c+=1
gnibbler

1
for i in range(d):s+=")"로 다시 쓸 수 있습니다 s+=")"*d. 그리고 당신은 174 개의 문자가 있습니다.
cemper93

@ cemper-좋은 지적. 나는 하루 종일 "_"* 80을하고 골프를 타는 것을 잊어 버린다 ... 제안에 대한 @gnibbler 덕분에!
arrdem

사실, 나는 당신이 전에 174 문자를 가지고 있음을 의미했습니다 . 지금 당신은 159에 있습니다.
cemper93
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.