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 golf golfowy , 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.
< : : :><:/><: :=":=:" ::></:>< /:>
?