Tag Parser ง่าย ๆ


9

นี่คือรูปแบบของตัวแยกวิเคราะห์ HTML ที่ให้อภัย แทนการแยกวิเคราะห์ HTML และการแยกแอตทริบิวต์ในโค้ดกอล์ฟนี้ตัวแยกวิเคราะห์แท็กจะง่าย

เขียนฟังก์ชั่นที่แยกวิเคราะห์โครงสร้างแท็กและส่งกลับแบบฟอร์มพาเรนต์ แท็กเปิดประกอบด้วยตัวอักษรตัวเล็กหนึ่งตัวและแท็กปิดประกอบด้วยตัวอักษรตัวใหญ่หนึ่งตัว ยกตัวอย่างเช่นการaAbaABแยกวิเคราะห์ลงไป(a)(b(a))หรือใน <a></a><b><a></a></b>HTML, แน่นอนแท็กสามารถอยู่ในการวางตำแหน่งและรัง

ต้องจัดการแท็กที่ปิด "ก่อนกำหนด" ยกตัวอย่างเช่นใน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

ไม่จำกัดความยาวหรือระดับการซ้อน
Ming-Tang

4
คุณควรเพิ่มกรณีทดสอบสำหรับอินพุตที่นำไปสู่ด้วยแท็กปิดเช่นAbcBCabA(ควรแยกวิเคราะห์(b(c))(a(b))รหัสของฉันอาจสั้นกว่านี้ยกเว้นกรณีนี้
MtnViewMark

คำตอบ:


1

Golfscript, 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 คุณสมบัติสนุก: สแต็คและเอาท์พุทสะสมจะถูกเก็บไว้ในสายเดียวกัน!

กรณีทดสอบ:

> 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

รหัสเครื่อง Z80 สำหรับ TI-83 +, 41 ไบต์

นี่คือการนำไปใช้ในรหัสเครื่องเลขฐานสิบหกสำหรับ z80 cpu ที่รันบน 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

Python - 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 - บันทึกพื้นที่ที่ไม่จำเป็นในฟังก์ชัน range ()

แก้ไข 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 สำหรับคำแนะนำ!
arrdem

อันที่จริงผมหมายความว่าคุณได้มี 174 ตัวอักษรก่อน ตอนนี้คุณอยู่ที่ 159 แล้ว
cemper93
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.