Schließen Sie Ihre Tags!

13

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 , 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.

Andrew Li
quelle
Wenn ein Tag mehr als ein Leerzeichen vor oder nach sich hat, müssen wir es als falsch markieren?
JayDepp
@ JayDepp Ja - lassen Sie mich das in meinem Beitrag
Andrew Li
Können wir Builtins verwenden, die Strings nach XML analysieren?
Oliver
@obarakon Das Problem ist, dass dies nicht unbedingt gültiges XML ist. Siehe die Fußnote.
Andrew Li
Ist es richtig zu sagen, dass dies eine ist truthy Eingang : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Antworten:

2

Retina , 76 74 Bytes

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

^[^<>]*$

Da ich gesehen habe, dass die Netzhaut wirklich gut zum Golfen von Regexen geeignet ist, dachte ich, ich würde es ausprobieren. Folgt der gleichen Logik wie meine Ruby-Antwort und gibt 0 oder 1 aus.

Probieren Sie es online!

JayDepp
quelle
1
Das brauchst du nicht M`. Wenn die Endphase nur einen Teil enthält, wird der Übereinstimmungsmodus impliziert.
Martin Ender
1

Ruby (2.3.1), 103 101 100 Bytes

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

Durch Anhängen aufgerufene anonyme Funktion .call("<Apple></Apple>"). Ersetzt übereinstimmende oder sich selbst schließende Tags, bis keine mehr vorhanden sind, und gibt dann zurück, ob die Zeichenfolge keine spitzen Klammern mehr enthält.

Probieren Sie es online!

JayDepp
quelle
Dies markiert <p title="This is a \"test\"."></p>als Falsey, aber es sollte nicht sein.
Orlp
@orlp 'Werte können alles außer "vor dem schließenden doppelten Anführungszeichen" enthalten.
JayDepp
Oh, es ist kein echtes XML ...
Orlp
1
Echtes XML sollte niemals mit Regex analysiert werden :)
JayDepp