Fermez vos tags!

13

Ceci est basé sur un défi supprimé du mien précédent avec le même nom

introduction

Vous êtes chargé d'écrire un programme qui renvoie une valeur true ou falsey selon que l'entrée possède toutes ses balises 1 de type XML correctement ouvertes et fermées et dans le bon ordre. Considérez ce qui suit comme entrée:

<Apple>

Cela retournerait une valeur de falsey car la balise n'est pas fermée correctement. Cette:

<Apple></Apple>

Au contraire, renvoie une valeur véridique car elle est correctement fermée. Le programme doit également vérifier les balises imbriquées pour s'assurer qu'elles sont dans la bonne position. Par exemple, prenez ceci comme entrée:

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

Toutes les balises sont fermées correctement, mais pas dans le bon ordre . Votre programme doit vérifier la bonne hiérarchie et l'imbrication des balises.

Définitions

Permettez-moi de définir quelques éléments avant d'entrer dans les règles et hypothèses.

Étiquette

Une balise de style XML de base. Par exemple: <Apple>. Ils peuvent avoir au plus un espace de début et de fin (ou bien c'est invalide et falsey), donc < Apple >et <Apple>sont les mêmes. Ces balises peuvent également contenir des attributs tels que foo="bar" (avec des guillemets doubles nécessaires ou invalides et d' autre Falsey) , et le nom d'attribut ne peuvent contenir des caractères alphanumériques ou _, :, -et .. Les noms d'attribut ne nécessitent pas non plus de valeur d'attribut et les valeurs peuvent contenir n'importe quoi sauf "avant le guillemet double de fermeture. La balise de fermeture ne doit pas contenir d'attributs et aucune balise ne doit contenir de nouvelle ligne.

Nom du tag

Les noms de balise sont les noms des balises. Par exemple, <Apple>le nom de la balise de est Apple. Les noms de balise peuvent contenir les mêmes caractères que les noms d'attribut et sont sensibles à la casse. Cela ne l'<Apple> est pas <apple> .

Balise à fermeture automatique

Une balise régulière qui se ferme telle que <Apple />ou <Apple/>(ce sont les mêmes). L'espace entre la barre oblique et le nom de la balise est autorisé.

Texte brut

Une chaîne de caractères qui peut contenir n'importe quoi et qui n'est pas incluse dans <et >.

Balise "simple"

Soit une balise d'ouverture, de fermeture ou de fermeture automatique.

Règles

  • La sortie peut être retournée ou imprimée, et l'entrée peut être prise comme vous le souhaitez
  • L'entrée est une chaîne composée de balises, de texte brut ou des deux
  • Votre programme peut être une fonction ou un programme de travail complet

  • Le texte brut peut être n'importe où; si l'entrée se compose uniquement de texte brut, le programme doit retourner une valeur véridique.

  • La reconnaissance des balises imbriquées est requise pour le programme. Si une balise est imbriquée dans une balise, cette balise imbriquée doit être fermée avant la fermeture du parent, tout comme le XML standard, sinon une valeur falsey doit être retournée

Hypothèses

  • Vous pouvez supposer que l'entrée sera toujours une ou plusieurs balises "simples"
  • Vous pouvez supposer que la saisie suivra toujours le format des balises défini ci-dessus

Cas de test

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>

Truthy

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>

Notation

Il s'agit de , donc le code le plus court en octets l'emporte. Les failles standard sont interdites comme d'habitude.


1 Remarque : Ce n'est pas du vrai XML, mais un pseudo-XML avec des règles différentes pour le défi. Les noms de balises et d'attributs diffèrent des spécifications.

Andrew Li
la source
Si une balise a plus d'un espace avant ou après, devons-nous la marquer fausse?
JayDepp
@JayDepp Oui - permettez-moi de clarifier cela dans mon message
Andrew Li
Pouvons-nous utiliser des fonctions intégrées qui analysent les chaînes en XML?
Oliver
@obarakon Le problème est que ce n'est pas nécessairement du XML valide. Voir la note de bas de page.
Andrew Li
Est - il exact de dire que c'est une entrée truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Réponses:

2

Rétine , 76 74 octets

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

^[^<>]*$

Depuis que j'ai vu que la rétine est vraiment bonne pour les regex de golf, j'ai pensé que je l'essayerais. Suit la même logique que ma réponse Ruby et affiche 0 ou 1.

Essayez-le en ligne!

JayDepp
la source
1
Vous n'en avez pas besoin M`. Si l'étape finale ne comporte qu'une seule partie, le mode de correspondance est implicite.
Martin Ender
1

Ruby (2.3.1), 103 101 100 octets

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

Fonction anonyme appelée en ajoutant .call("<Apple></Apple>"). Remplace les balises correspondantes ou à fermeture automatique jusqu'à ce qu'il n'y en ait pas, puis retourne si la chaîne n'a plus de crochets angulaires.

Essayez-le en ligne!

JayDepp
la source
C'est <p title="This is a \"test\"."></p>Falsey, mais ça ne devrait pas l'être.
orlp
@orlp 'les valeurs peuvent contenir n'importe quoi sauf "avant le guillemet double de fermeture".
JayDepp
Oh ce n'est pas du vrai XML ...
orlp
1
Le vrai XML ne doit jamais être analysé avec regex :)
JayDepp