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 code-golf , 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.
< : : :><:/><: :=":=:" ::></:>< /:>
?Réponses:
Rétine ,
7674 octetsDepuis 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!
la source
M`
. Si l'étape finale ne comporte qu'une seule partie, le mode de correspondance est implicite.Ruby (2.3.1),
103101100 octetsFonction 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!
la source
<p title="This is a \"test\"."></p>
Falsey, mais ça ne devrait pas l'être.