Tutup tag Anda!

13

Ini didasarkan pada tantangan saya yang dihapus sebelumnya dengan nama yang sama

pengantar

Anda ditugasi untuk menulis program yang mengembalikan nilai kebenaran atau kesalahan berdasarkan pada apakah input memiliki semua 1 tag mirip-XML yang dibuka dan ditutup dengan benar dan dalam urutan yang benar. Pertimbangkan hal berikut sebagai input:

<Apple>

Ini akan mengembalikan nilai falsey karena tag tidak ditutup dengan benar. Ini:

<Apple></Apple>

Sebaliknya mengembalikan nilai kebenaran karena ditutup dengan benar. Program juga harus memeriksa tag bersarang untuk memastikan mereka berada di posisi yang benar. Misalnya, ambil ini sebagai input:

<mango><Apple></mango></Apple>

Semua tag ditutup dengan benar, tetapi tidak dalam urutan yang benar . Program Anda harus memeriksa hierarki dan penandaan tag yang benar.

Definisi

Biarkan saya mendefinisikan beberapa hal sebelum saya masuk ke aturan dan asumsi.

Menandai

Tag gaya XML dasar. Sebagai contoh: <Apple>. Mereka dapat memiliki paling banyak, satu ruang mengarah dan tertinggal (atau tidak valid dan palsu), jadi < Apple >dan <Apple>sama. Tag ini juga dapat berisi atribut seperti foo="bar" (dengan tanda kutip diperlukan ganda, atau tidak valid lain dan falsey) , dan nama atribut hanya dapat berisi karakter alfanumerik atau _, :, -, dan .. Nama-nama atribut juga tidak memerlukan nilai atribut, dan nilai-nilai dapat berisi apa pun kecuali "sebelum kutipan ganda penutupan. Tag penutup tidak boleh mengandung atribut, dan tag tidak boleh memiliki baris baru di dalamnya.

Nama Tag

Nama tag adalah nama tag. Misalnya, <Apple>nama tag adalah Apple. Nama tag dapat berisi karakter yang sama dengan nama atribut, dan peka huruf besar-kecil. Ini berarti <Apple>adalah tidak <apple> .

Tag Penutupan Sendiri

Tag reguler yang menutup sendiri seperti <Apple />atau <Apple/>(mereka sama). Ruang antara garis miring dan nama tag diizinkan.

Teks Biasa

String karakter yang dapat berisi apa saja dan tidak termasuk dalam <dan >.

Tag "Sederhana"

Entah tag pembuka, penutup, atau tutup sendiri.

Aturan

  • Output dapat dikembalikan atau dicetak, dan input dapat diambil dengan cara apa pun yang Anda suka
  • Input adalah string, yang terdiri dari tag, teks biasa, atau keduanya
  • Program Anda dapat berupa fungsi atau program kerja keseluruhan

  • Teks biasa bisa di mana saja; jika input hanya terdiri dari teks biasa, program harus mengembalikan nilai yang sebenarnya.

  • Pengenalan tag bersarang diperlukan untuk program ini. Jika tag bersarang di tag, tag bersarang itu harus ditutup sebelum induknya ditutup, seperti halnya XML biasa, atau nilai falsey harus dikembalikan

Asumsi

  • Anda dapat mengasumsikan bahwa input akan selalu menjadi satu atau lebih tag "sederhana"
  • Anda dapat berasumsi bahwa input akan selalu mengikuti format untuk tag yang ditentukan di atas

Uji Kasus

Falsey

<apple>

<apple></Apple>

<apple></mango>

<apple><mango>

<a><b></a></b>

Text<ul><li></li><ul />

<pear attr=foo></pear attr=foo>

<Ketchup flavor=spicy></Ketchup>

<Ap ple></Apple>

Sejujurnya

Text 

<Apple />

<Apple></Apple>

< Apple ></ Apple>

<mango><Apple/></mango>

<mango>Text<div class="bar">More text \o/</div></mango>

<food group="fruit">Fruits:<orange :fruit-variety="clementine" /><pear _fruit.type="asian" /></food>

<example foo="abcdefghijklmnopqrstuvwxyz1234567890-/:;()$&@.,?!'" noValue>Any characters allowed! (0.0)</example>

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang. Celah standar dilarang seperti biasa.


1 Catatan : Ini bukan XML asli, tetapi pseudo-XML dengan aturan berbeda untuk tantangan tersebut. Tag dan nama atribut berbeda dari spesifikasi.

Andrew Li
sumber
Jika tag memiliki lebih dari satu spasi sebelum atau sesudahnya, apakah kita harus menandainya salah?
JayDepp
@JayDepp Ya - izinkan saya mengklarifikasi bahwa dalam posting saya
Andrew Li
Bisakah kita menggunakan bawaan yang mem-parsing string ke XML?
Oliver
@obarakon Masalahnya adalah ini belum tentu valid XML. Lihat catatan kaki.
Andrew Li
Apakah benar untuk mengatakan, bahwa ini adalah masukan truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Jawaban:

2

Retina , 76 74 Bytes

+`< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(/>|>[^<>]*< ?/ ?\1 ?>)

^[^<>]*$

Karena saya telah melihat bahwa retina sangat bagus untuk regex golf, saya pikir saya akan mencobanya. Mengikuti logika yang sama dengan jawaban Ruby saya dan mencetak 0 atau 1.

Cobalah online!

JayDepp
sumber
1
Anda tidak membutuhkannya M`. Jika tahap akhir hanya memiliki satu bagian, mode pertandingan tersirat.
Martin Ender
1

Ruby (2.3.1), 103 101 100 Bytes

->s{s.sub!(/< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(\/>|>[^<>]*< ?\/ ?\1 ?>)/,'')&&redo;!(s=~/<|>/)}

Fungsi anonim dipanggil dengan menambahkan .call("<Apple></Apple>"). Mengganti tag yang cocok atau ditutup sendiri sampai tidak ada, dan kemudian mengembalikan apakah string tidak memiliki tanda kurung sudut yang tersisa.

Cobalah online!

JayDepp
sumber
Tanda ini <p title="This is a \"test\"."></p> sebagai Falsey, tetapi seharusnya tidak.
orlp
Nilai @orlp 'dapat berisi apa saja kecuali "sebelum kutipan ganda penutup."
JayDepp
Oh, ini bukan XML asli ...
orlp
1
XML nyata tidak boleh diuraikan dengan regex :)
JayDepp