Etiketlerinizi kapatın!


13

Bu, aynı ada sahip daha önce silinmiş bir meydan okumamı temel alıyor

Giriş

Girişin XML benzeri 1 etiketlerinin tümü uygun şekilde açılmış ve kapatılmış ve doğru sırada olup olmadığına bağlı olarak doğruluk veya falsey değeri döndüren bir program yazmakla görevlendirilirsiniz . Girdi olarak aşağıdakileri düşünün:

<Apple>

Etiket doğru şekilde kapatılmadığından, bu durum bir falsey değeri döndürür. Bu:

<Apple></Apple>

Aksine doğru bir şekilde kapatıldığından doğruluk değeri döndürür. Program ayrıca doğru konumda olduklarından emin olmak için iç içe etiketleri de kontrol etmelidir. Örneğin, bunu giriş olarak alın:

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

Tüm etiketler doğru bir şekilde kapatılmış, ancak doğru sırada değil . Programınız doğru etiket hiyerarşisini ve iç içe yerleştirmeyi kontrol etmelidir.

Tanımlar

Kurallara ve varsayımlara girmeden önce birkaç şey tanımlayayım.

Etiket

Temel bir XML tarzı etiket. Örneğin: <Apple>. Onlar çok, lider ve uzay sondaki (aksi takdirde geçersiz ve Falsey var), en fazla birine sahip olabilir < Apple >ve <Apple>aynıdır. Bu etiketler gibi özelliklerini içerebilir foo="bar" (gerekli çift tırnak, ya da başka geçersiz ve Falsey ile) ve öznitelik adı sadece herhangi bir alfasayısal karakter veya içerebilir _, :, -, ve .. Özellik adları da bir özellik değeri gerektirmez ve değerler "kapanış çift tırnak işareti dışında herhangi bir şey içerebilir . Kapanış etiketi nitelik içermemeli ve hiçbir etiketin içinde yeni satır olmamalıdır.

Etiket adı

Etiket adları etiketlerin adlarıdır. Örneğin, <Apple>etiket adı Apple. Etiket adları, özellik adlarıyla aynı karakterleri içerebilir ve büyük / küçük harf duyarlıdır. Bu araç <Apple>olduğunu değil <apple> .

Kendiliğinden Kapanan Etiket

Kendini <Apple />veya gibi kapatan normal bir etiket <Apple/>(aynıdır). / Ve etiket adı arasındaki boşluğa izin verilir.

Düz Metin

Şey içerebilir ve içine alınmasa karakter dize <ve >.

"Basit" Etiket

Bir açılış, kapanış veya kendi kendine kapanan etiket.

kurallar

  • Çıktı iade edilebilir veya yazdırılabilir ve girdi istediğiniz şekilde alınabilir
  • Girdi, etiketler, düz metin veya her ikisinden oluşan bir dizedir
  • Programınız bir işlev veya tüm çalışan bir program olabilir

  • Düz metin herhangi bir yerde olabilir; giriş yalnızca düz metin içeriyorsa, program doğruluk değeri döndürmelidir.

  • Program için iç içe etiketlerin tanınması gerekir. Bir etiket bir etikete iç içe yerleştirilmişse, iç içe geçmiş etiketin tıpkı normal XML gibi üst öğe kapatılmadan önce kapatılması gerekir, aksi takdirde bir falsey değeri döndürülmelidir

Varsayımlar

  • Girişin her zaman bir veya daha fazla "basit" etiket olacağını varsayabilirsiniz.
  • Girişin her zaman yukarıda tanımlanan etiketlerin biçimini izleyeceğini varsayabilirsiniz.

Test Durumları

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>

Doğru

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>

puanlama

Bu , bu nedenle bayttaki en kısa kod kazanır. Standart boşluklar her zamanki gibi yasaktır.


1 Not : Bu gerçek XML değil, meydan okuma için farklı kurallara sahip bir sahte XML'dir. Etiket ve özellik adları spesifikasyondan farklıdır.


Bir etiketten önce veya sonra birden fazla boşluk varsa, etiketi yanlış olarak işaretlememiz gerekir mi?
JayDepp

@JayDepp Evet - yazımda bunu açıklığa kavuşturalım
Andrew Li

Dizeleri XML olarak ayrıştıran yerleşikleri kullanabilir miyiz?
Oliver

@obarakon Sorun, bunun mutlaka geçerli bir XML olmamasıdır. Bkz. Dipnot.
Andrew Li

Bunun bir olduğunu söylemek doğru mu truthy girişi : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernameburada

Yanıtlar:


2

Retina , 76 74 Bayt

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

^[^<>]*$

Retinanın golf regexes için gerçekten iyi olduğunu gördüm, ben denemek düşündüm. Ruby yanıtımla aynı mantığı izler ve 0 veya 1 yazdırır.

Çevrimiçi deneyin!


1
İhtiyacınız yok M`. Son aşamada yalnızca tek bir bölüm varsa, eşleme modu ima edilir.
Martin Ender

1

Yakut (2.3.1), 103 101 , 100 bayt

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

Anonim işlev eklenerek çağrılır .call("<Apple></Apple>"). Eşleşen veya kendiliğinden kapanan etiketleri değiştirilinceye kadar değiştirir ve dizenin açılı köşeli parantez kalmadığını döndürür.

Çevrimiçi deneyin!


Bu <p title="This is a \"test\"."></p>Falsey olarak işaret ediyor, ama olmamalı.
orlp

@orlp 'değerleri "kapanış çift tırnak işaretinden önce" dışında herhangi bir şey içerebilir.
JayDepp

Oh bu gerçek XML değil ...
orlp

1
Gerçek XML asla regex ile ayrıştırılmamalıdır :)
JayDepp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.