সাধারণ ট্যাগ পার্সার


9

এটি একটি ক্ষমাশীল HTML পার্সারের একটি মডেল of এইচটিএমএল পার্সিং এবং বৈশিষ্ট্যগুলি বের করার পরিবর্তে এই কোড গল্ফে ট্যাগ পার্সারটি সহজ হবে simple

একটি ফাংশন লিখুন যা কোনও ট্যাগ কাঠামোকে বিশ্লেষণ করে এবং এর প্রথম বন্ধনী ফর্মটি দেয়। একটি খোলার ট্যাগটিতে একটি ছোট হাতের অক্ষর থাকে এবং একটি ক্লোজিং ট্যাগে একটি বড় হাতের অক্ষর থাকে। উদাহরণস্বরূপ, বা এইচটিএমএল মধ্যে aAbaABপার্স ,। অবশ্যই, ট্যাগগুলি জুস্টপজিশন এবং নীড়ের মধ্যে থাকতে পারে।(a)(b(a))<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)

সংক্ষিপ্ততম কোড জিতেছে।


অন্য কোনও কোড গল্ফের মতো, স্ট্যান্ডার্ড লাইব্রেরি অনুমোদিত
মিং-টাং

দৈর্ঘ্য বা নেস্টিং স্তরের কোনও সীমা নেই
মিং-টাং

4
আপনার AbcBCabA(b(c))(a(b))
ইনপুটটির

উত্তর:


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

হাস্কেল, ১১১ টি অক্ষর

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 দ্বারা প্রস্তাবিত হিসাবে একটি প্যাটার্ন ব্যবহার করেছে

@ প্যাটার্ন ডি এর জন্য ব্যবহার করা: z দুটি অক্ষর বাঁচাতে পারে।
ফুজজেক্সএল

4

টিআই -৩৩ + ৪১ বাইটের জন্য জেড 80 মেশিন কোড

এটি একটি টিআই -৩৩ + তে চলমান একটি z80 সিপিইউর জন্য হেক্সাডেসিমাল মেশিন কোডে একটি বাস্তবায়ন।

11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9

XXXX (3 - 6 অন্তর্ভুক্ত) আপনি যে স্ট্রিংটি পার্স করছেন তার 16 বিট ঠিকানা, বিয়োগ 1 বাইট।

জেড 80-এএসসিআইতে এনকোডড:

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

(আনুমানিক, কারণ টিআই ক্যালকুলেটরগুলির নিজস্ব চরিত্র সেট রয়েছে))

নোট যে AsmPrgmউপরোক্ত মধ্যে অন্তর্ভুক্ত করা হয় না


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 টি স্পেসের পরিবর্তে একটি একক ট্যাব ব্যবহার করতে পারেন। কোড কোডআপ এটি পরিচালনা করতে পারে না যদিও :(। আপনার ক্ষেত্রে কেবল নতুন লাইন এবং স্পেসগুলি পুরোপুরি ছেড়ে দিন eg যেমন if ...:s+=")";c-=1এবংelse:s+="("+f;c+=1
গিনিবলার

1
for i in range(d):s+=")"হিসাবে আবার লিখতে পারেন s+=")"*d। এবং আপনার 174 টি চর রয়েছে।
cemper93

@ ইম্পার - ভাল পয়েন্ট যে। আমি সারা দিন "_" * 80 করি এবং গল্ফ করার সময় এটি ভুলে যাই .... এছাড়াও, পরামর্শগুলির জন্য @gnibbler কে ধন্যবাদ!
এয়ারডেমি

বাস্তবিক, আমি বোঝানো যে আপনার 174 অক্ষর ছিল আগে । সুতরাং আপনি এখন 159 এ আছেন।
cemper93
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.