Dies basiert auf einer zuvor gelöschten Herausforderung von mir mit dem gleichen Namen
Einführung
Sie müssen ein Programm schreiben, das einen Wahrheits- oder Falsch-Wert zurückgibt, basierend darauf, ob die Eingabe alle XML-ähnlichen 1- Tags ordnungsgemäß geöffnet und geschlossen hat und in der richtigen Reihenfolge. Betrachten Sie Folgendes als Eingabe:
<Apple>
Dies würde einen falschen Wert zurückgeben, da das Tag nicht korrekt geschlossen wird. Dies:
<Apple></Apple>
Im Gegenteil, es wird ein wahrer Wert zurückgegeben, weil er korrekt geschlossen wurde. Das Programm sollte auch verschachtelte Tags überprüfen, um sicherzustellen, dass sie sich an der richtigen Position befinden. Nehmen Sie zum Beispiel Folgendes als Eingabe:
<mango><Apple></mango></Apple>
Alle Tags sind korrekt geschlossen, aber nicht in der richtigen Reihenfolge . Ihr Programm muss die korrekte Variablenhierarchie und Verschachtelung überprüfen.
Definitionen
Lassen Sie mich einige Dinge definieren, bevor ich mich mit den Regeln und Annahmen befasse.
Etikett
Ein einfaches XML-Tag. Zum Beispiel: <Apple>
. Sie können höchstens haben, einen vorderen und hinteren Raum (oder sonst ist es ungültig und Falsey), so < Apple >
und <Apple>
sind gleich. Diese Tags können auch Attribute enthalten wie foo="bar"
(mit dem erforderlichen doppelten Anführungszeichen, sonst ungültig und Falsey) , und der Attributname kann nur ein beliebiges alphanumerische Zeichen oder _
, :
, -
, und .
. Die Attributnamen erfordern auch keinen Attributwert, und Werte können alles enthalten, außer "
vor dem schließenden doppelten Anführungszeichen. Das schließende Tag darf keine Attribute enthalten und keine Tags sollten Zeilenumbrüche enthalten.
Verlinke den Namen
Tag-Namen sind die Namen der Tags. Der <Apple>
Tag-Name von lautet beispielsweise Apple
. Tag-Namen können dieselben Zeichen wie Attributnamen enthalten und unterscheiden zwischen Groß- und Kleinschreibung. Dieses Mittel <Apple>
ist nicht <apple>
.
Selbstschließendes Tag
Ein reguläres Tag, das sich selbst schließt wie <Apple />
oder <Apple/>
(sie sind gleich). Das Leerzeichen zwischen dem Schrägstrich und dem Tag-Namen ist zulässig.
Einfacher Text
Eine Zeichenfolge, die alles enthalten kann und nicht in <
und eingeschlossen ist >
.
"Einfaches" Tag
Entweder ein öffnendes, schließendes oder selbstschließendes Tag.
Regeln
- Die Ausgabe kann zurückgegeben oder gedruckt werden, und die Eingabe kann nach Belieben erfolgen
- Die Eingabe ist eine Zeichenfolge, die entweder aus Tags, einfachem Text oder beidem besteht
Ihr Programm kann eine Funktion oder ein ganzes Arbeitsprogramm sein
Klartext kann überall sein; Wenn die Eingabe nur aus Klartext besteht , sollte das Programm einen Wahrheitswert zurückgeben.
Die Erkennung verschachtelter Tags ist für das Programm erforderlich. Wenn ein Tag in einem Tag verschachtelt ist, muss dieses verschachtelte Tag geschlossen werden, bevor das übergeordnete Tag geschlossen wird, genau wie reguläres XML. Andernfalls sollte ein falsey-Wert zurückgegeben werden
Annahmen
- Sie können davon ausgehen, dass es sich bei der Eingabe immer um ein oder mehrere "einfache" Tags handelt.
- Sie können davon ausgehen, dass die Eingabe immer dem oben definierten Format für Tags folgt
Testfälle
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>
Wahrheit
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>
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Standardlücken sind wie gewohnt verboten.
1 Hinweis : Dies ist kein echtes XML, sondern ein Pseudo-XML mit unterschiedlichen Regeln für die Herausforderung. Tag- und Attributnamen weichen von der Spezifikation ab.
< : : :><:/><: :=":=:" ::></:>< /:>
?