Ini adalah model pengurai HTML yang pemaaf. Alih-alih mem-parsing HTML dan mengekstraksi atribut, dalam kode golf ini, parser tag akan menjadi sederhana.
Tulis fungsi yang mem-parsing struktur tag dan mengembalikan formulir yang disisipkan. Tag pembuka terdiri dari satu huruf kecil, dan tag penutup terdiri dari satu huruf besar. Misalnya, aAbaAB
mem-parsing ke dalam (a)(b(a))
, atau dalam HTML <a></a><b><a></a></b>
,. Tentu saja, tag dapat disandingkan dan bersarang.
Tag tertutup "Prematur" harus ditangani. Misalnya, di abcA
, A
tutup bagian terluar a
, jadi diuraikan (a(b(c)))
.
Tag penutup ekstra hanya diabaikan: aAB
diurai menjadi (a)
.
Tag yang tumpang tindih TIDAK ditangani. Misalnya, abAB
mem-parsing ke dalam (a(b))
, tidak (a(b))(b)
, oleh aturan sebelumnya dari tag penutup tambahan ( abAB
-> abA
( (a(b))
) + B
(ekstra)).
Dengan asumsi tidak ada spasi putih dan karakter ilegal lainnya dalam input.
Anda tidak diizinkan menggunakan perpustakaan apa pun.
Berikut ini adalah implementasi referensi dan daftar kasus uji:
#!/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)
Kode terpendek menang.
AbcBCabA
(harus diurai sebagai(b(c))(a(b))
. Kode saya bisa lebih pendek kecuali untuk case ini.Jawaban:
Golfscript, 54 karakter
Tes
sumber
Haskell, 111 karakter
Ini golf yang bagus untuk Haskell. Fitur menyenangkan: Tumpukan dan akumulasi keluaran disimpan dalam string yang sama!
Kasus uji:
@
pola seperti yang disarankan oleh FUZxxlsumber
Kode Mesin Z80 untuk TI-83 +, 41 byte
Ini adalah implementasi dalam kode mesin heksadesimal untuk cpu z80 yang berjalan pada TI-83 +.
11XXXX131AFE61380F6FE53E28CD9DB47DCD9DB4188EE1BDC03E29CD9DB4189BEF4504E5214CE1C9
XXXX (3 - 6 inklusif) adalah alamat 16-bit dari string yang Anda parsing, minus 1 byte.
Disandikan dalam Z80-ASCII:
¹XX≤¯•⟙8𝑭o↥>(ˣïÑ}ˣïÑ≠á↑γ∊>)ˣïÑ≠Ì⬆︎E𝑤↥!₄L↑Φ
(Perkiraan, karena kalkulator TI memiliki karakter mereka sendiri.)
CATATAN BAHWA
AsmPrgm
TIDAK TERMASUK DI ATASsumber
Windows PowerShell, 142
146147152156169Beberapa hal yang perlu diperhatikan: Ini hanya blok skrip. Itu dapat ditugaskan ke variabel atau diberi nama fungsi, jika perlu. Anda juga dapat menjalankannya dengan meletakkan
.
atau&
di depannya dan argumen di akhir. Menggunakan ruang terakhir untuk mengakhiri tag yang tidak tertutup.Lewati semua tes. Skrip uji:
sumber
Python -
114113153 153192174159 karakterMenyalahgunakan parser lekukan python untuk menggunakan satu spasi untuk satu tab penuh, lima untuk dua tab.
Sunting 1 - menyimpan ruang yang tidak dibutuhkan dalam fungsi rentang ()
Sunting 2 - diperbaiki untuk menangani tata bahasa parse yang tidak tepat, tag yang tidak terminasi.
Sunting 3 - memperbaiki bug di mana parse "salah" dapat dihasilkan oleh ambiguitas di pohon tag. Menerapkan strategi berbasis tumpukan, bukan penghitung.
Sunting 4 - berganti nama s.find ke o untuk mencegah penyimpanan karakter yang digunakan untuk memanggilnya berulang kali. melakukan hal yang sama untuk f.lower.
Sunting 5 - menambahkan hack ruang / tab, menyimpan tiga karakter.
Sunting 6 - membuang lingkaran demi ")" * d.
sumber
ord(f)...
Anda dapat menggunakan'@'<f<'\\'
Jika Anda tidak perlu untuk memeriksa'\\'
Anda dapat menggunakan']'
bukannyaif ...:s+=")";c-=1
danelse:s+="("+f;c+=1
for i in range(d):s+=")"
dapat ditulis ulang sebagais+=")"*d
. Dan Anda memiliki 174 karakter.