Zamknij tagi!

13

Jest to oparte na moim wcześniejszym usuniętym wyzwaniu o tej samej nazwie

Wprowadzenie

Twoim zadaniem jest napisanie programu, który zwraca prawdziwą lub falsey wartość na podstawie tego, czy dane wejściowe mają wszystkie znaczniki podobne do XML 1 odpowiednio otwarte i zamknięte we właściwej kolejności. Weź pod uwagę następujące dane wejściowe:

<Apple>

Zwróciłoby to wartość falsey, ponieważ znacznik nie został poprawnie zamknięty. To:

<Apple></Apple>

Przeciwnie, zwraca prawdziwą wartość, ponieważ jest poprawnie zamknięta. Program powinien również sprawdzić zagnieżdżone znaczniki, aby upewnić się, że znajdują się we właściwej pozycji. Na przykład weź to jako dane wejściowe:

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

Wszystkie tagi są poprawnie zamknięte, ale nie we właściwej kolejności . Twój program musi sprawdzić poprawność hierarchii znaczników i zagnieżdżenia.

Definicje

Pozwól mi zdefiniować kilka rzeczy, zanim przejdę do zasad i założeń.

Etykietka

Podstawowy znacznik w stylu XML. Na przykład: <Apple>. Mogą one mieć co najwyżej jedną przednią i tylną przestrzeń (albo jest nieważna i falsey), tak < Apple >i <Apple>są takie same. Znaczniki te mogą także zawierać atrybuty takie jak foo="bar" (z wymaganymi cudzysłowach lub inny nieważny i falsey) , a nazwa atrybutu może zawierać tylko dowolny znak alfanumeryczny lub _, :, -, i .. Nazwy atrybutów również nie wymagają wartości atrybutu, a wartości mogą zawierać wszystko oprócz "wcześniejszego podwójnego cudzysłowu. Znacznik zamykający nie może zawierać atrybutów, a żaden znacznik nie powinien zawierać znaków nowej linii.

Nazwa znacznika

Nazwy znaczników to nazwy znaczników. Na przykład <Apple>nazwa znacznika to Apple. Nazwy znaczników mogą zawierać te same znaki, co nazwy atrybutów, i rozróżniana jest wielkość liter. Oznacza to, <Apple>to nie <apple> .

Tag samozamykający

Zwykły tag, który zamyka się, taki jak <Apple />lub <Apple/>(są takie same). Dozwolona jest spacja między ukośnikiem a nazwą znacznika.

Zwykły tekst

Ciąg znaków, który może zawierać wszystko i nie jest ujęty w <i >.

Tag „prosty”

Tag otwierający, zamykający lub samozamykający się.

Zasady

  • Dane wyjściowe mogą zostać zwrócone lub wydrukowane, a dane wejściowe można pobrać w dowolny sposób
  • Dane wejściowe to ciąg znaków składający się z tagów, zwykłego tekstu lub obu
  • Twój program może być funkcją lub całym działającym programem

  • Zwykły tekst może być wszędzie; jeśli dane wejściowe składają się tylko z czystego tekstu, program powinien zwrócić prawdziwą wartość.

  • Program musi rozpoznać zagnieżdżone znaczniki. Jeśli znacznik jest zagnieżdżony w znaczniku, ten zagnieżdżony znacznik musi zostać zamknięty przed zamknięciem elementu nadrzędnego, podobnie jak zwykły kod XML, w przeciwnym razie należy zwrócić wartość falsey

Założenia

  • Możesz założyć, że wejście będzie zawsze jednym lub więcej „prostymi” tagami
  • Możesz założyć, że dane wejściowe będą zawsze zgodne z formatem zdefiniowanych powyżej tagów

Przypadki testowe

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>

Prawda

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>

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach. Standardowe luki są jak zwykle zabronione.


1 Uwaga : To nie jest prawdziwy XML, ale pseudo-XML z różnymi regułami dla wyzwania. Nazwy znaczników i atrybutów różnią się od specyfikacji.

Andrew Li
źródło
Jeśli tag ma więcej niż jedną spację przed nim lub po nim, czy musimy zaznaczyć go jako fałsz?
JayDepp
@JayDepp Tak - pozwól mi wyjaśnić to w moim poście
Andrew Li
Czy możemy używać wbudowanych funkcji, które analizują ciągi znaków do XML?
Oliver,
@obarakon Problem polega na tym, że niekoniecznie jest to poprawny XML. Zobacz przypis.
Andrew Li
Jest to poprawne powiedzieć, że jest to wejście truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
inserttusernamehere

Odpowiedzi:

2

Retina , 76 74 bajtów

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

^[^<>]*$

Ponieważ widziałem, że siatkówka jest naprawdę dobra dla golfowych wyrażeń regularnych, pomyślałem, że spróbuję. Kieruje się tą samą logiką, co moja odpowiedź Ruby i wypisuje 0 lub 1.

Wypróbuj online!

JayDepp
źródło
1
Nie potrzebujesz M`. Jeśli ostatni etap ma tylko jedną część, sugerowany jest tryb dopasowania.
Martin Ender
1

Ruby (2.3.1), 103 101 100 bajtów

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

Funkcja anonimowa wywoływana przez dołączanie .call("<Apple></Apple>"). Zastępuje pasujące lub samozamykające się tagi, dopóki ich nie ma, a następnie zwraca, czy w łańcuchu nie ma nawiasów ostrych.

Wypróbuj online!

JayDepp
źródło
To oznacza <p title="This is a \"test\"."></p>Falsey, ale tak nie powinno być.
lub
Wartości @orlp „mogą zawierać wszystko oprócz„ przed podwójnym cudzysłowiem ”.
JayDepp
Och, to nie jest prawdziwy XML ...
lub
1
Prawdziwe XML nigdy nie powinno być analizowane z wyrażeniem regularnym :)
JayDepp