सिंपल टैग पार्सर


9

यह क्षमाशील HTML पार्सर का एक मॉडल है। HTML को पार्स करने और विशेषताओं को निकालने के बजाय, इस कोड गोल्फ में, टैग पार्सर सरल होगा।

एक फ़ंक्शन लिखें जो एक टैग संरचना को पार्स करता है और इसके पेरेंटाइज्ड फॉर्म को वापस करता है। एक उद्घाटन टैग में एक लोअरकेस अक्षर होता है, और एक समापन टैग में एक अपरकेस अक्षर होता है। उदाहरण के लिए, aAbaABपर्स में (a)(b(a))या HTML में <a></a><b><a></a></b>। बेशक, टैग juxtaposition और घोंसले में हो सकते हैं।

"समय से पहले" बंद टैग को संभाला जाना चाहिए। उदाहरण के लिए, में abcA, Aसबसे बाहरी को बंद कर देता है a, इसलिए यह पार्स करता है (a(b(c)))

अतिरिक्त समापन टैग को केवल अनदेखा किया जाता है: aABपर्स में (a)

ओवरलैपिंग टैग संभाले नहीं हैं। उदाहरण के लिए, अतिरिक्त समापन टैग ( -> ( ) + (अतिरिक्त)) के पिछले नियम के अनुसार , 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)

सबसे छोटा कोड जीतता है।


किसी भी अन्य कोड गोल्फ की तरह, मानक पुस्तकालय की अनुमति दी
मिंग-तांग

लंबाई और न ही घोंसले के स्तर पर कोई सीमा नहीं
मिंग-तांग

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 के लिए @ -pattern का उपयोग करके दो वर्णों को बचाया जा सकता है।
फ्यूजएक्सएक्सएल

4

Z80 मशीन कोड TI-83 +, 41 बाइट्स के लिए

यह एक TI-83 + पर चलने वाले z80 सीपीयू के लिए हेक्साडेसिमल मशीन कोड में एक कार्यान्वयन है।

11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9

XXXX (3 - 6 समावेशी) स्ट्रिंग का 16-बिट पता है जिसे आप पार्स कर रहे हैं, माइनस 1 बाइट।

Z80-ASCII में एन्कोडेड:

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

(अनुमानित, क्योंकि TI कैलकुलेटरों का अपना वर्ण सेट है।)

ध्यान दें कि AsmPrgmABOVE में शामिल नहीं है


2

विंडोज पॉवरशेल, 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

एक पूर्ण टैब के लिए एक स्थान का उपयोग करने के लिए अजगर के इंडेंटेशन पार्सर का दुरुपयोग करता है, दो टैब के लिए पांच।

1 संपादित करें - रेंज () फ़ंक्शन में एक अनावश्यक स्थान बचाया

2 संपादित करें - अनुचित पार्स व्याकरण, असम्बद्ध टैग से निपटने के लिए तय।

संपादित 3 - एक बग तय किया जिससे "गलत" पर्स टैग ट्री में अस्पष्टता द्वारा उत्पन्न किया जा सकता है। एक काउंटर के बजाय एक स्टैक-आधारित रणनीति को लागू किया।

संपादित करें 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 को धन्यवाद!
गिरफ्तारी

दरअसल, मेरा मतलब था कि आपके पास पहले 174 चरस थी । तो आप अभी 159 पर हैं।
cemper93
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.