Esto se basa en un desafío mío eliminado anterior con el mismo nombre
Introducción
Se le asigna la tarea de escribir un programa que devuelva un valor verdadero o falso en función de si la entrada tiene todas sus etiquetas 1 de tipo XML adecuadamente abiertas y cerradas y en el orden correcto. Considere lo siguiente como entrada:
<Apple>
Esto devolvería un valor falsey porque la etiqueta no está cerrada correctamente. Esta:
<Apple></Apple>
Por el contrario, devuelve un valor verdadero porque está cerrado correctamente. El programa también debe verificar las etiquetas anidadas para asegurarse de que estén en la posición correcta. Por ejemplo, tome esto como entrada:
<mango><Apple></mango></Apple>
Todas las etiquetas están cerradas correctamente, pero no en el orden correcto . Su programa debe verificar la correcta jerarquía de etiquetas y anidamiento.
Definiciones
Permítanme definir algunas cosas antes de entrar en las reglas y suposiciones.
Etiqueta
Una etiqueta básica de estilo XML. Por ejemplo: <Apple>
. Pueden tener a lo sumo, un espacio inicial y final (o de lo contrario es inválido y falsey), < Apple >
y <Apple>
son lo mismo. Estas etiquetas también pueden contener atributos como foo="bar"
(con las comillas dobles requeridos, o no válida y demás Falsey-) , y el nombre del atributo sólo pueden contener cualquier carácter alfanumérico o _
, :
, -
, y .
. Los nombres de los atributos tampoco requieren un valor de atributo, y los valores pueden contener cualquier cosa, excepto "
antes de la comilla doble de cierre. La etiqueta de cierre no debe contener atributos, y ninguna etiqueta debe tener nuevas líneas.
Nombre de etiqueta
Los nombres de las etiquetas son los nombres de las etiquetas. Por ejemplo, <Apple>
el nombre de la etiqueta es Apple
. Los nombres de etiqueta pueden contener los mismos caracteres que los nombres de atributo y distinguen entre mayúsculas y minúsculas. Esto significa <Apple>
que no lo es <apple>
.
Etiqueta de cierre automático
Una etiqueta normal que se cierra como <Apple />
o <Apple/>
(son lo mismo). El espacio entre la barra y el nombre de la etiqueta está permitido.
Texto sin formato
Una cadena de caracteres que puede contener cualquier cosa y que no están encerrados en <
y >
.
Etiqueta "simple"
Una etiqueta de apertura, cierre o cierre automático.
Reglas
- La salida puede devolverse o imprimirse, y la entrada puede tomarse de la manera que desee
- La entrada es una cadena, que consta de etiquetas, texto sin formato o ambos
Su programa puede ser una función o un programa de trabajo completo
El texto sin formato puede estar en cualquier lugar; si la entrada consta solo de texto sin formato, el programa debería devolver un valor verdadero.
Se requiere el reconocimiento de etiquetas anidadas para el programa. Si una etiqueta está anidada en una etiqueta, esa etiqueta anidada debe cerrarse antes de que se cierre el padre, al igual que XML normal, o de lo contrario se debe devolver un valor falsey
Supuestos
- Puede suponer que la entrada siempre será una o más etiquetas "simples"
- Puede suponer que la entrada siempre seguirá el formato de las etiquetas definidas anteriormente
Casos de prueba
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>
Verdad
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>
Puntuación
Este es el código de golf , por lo que gana el código más corto en bytes. Las lagunas estándar están prohibidas como de costumbre.
1 Nota : Este no es un XML real, sino un pseudo-XML con diferentes reglas para el desafío. Los nombres de etiquetas y atributos difieren de las especificaciones.
fuente
< : : :><:/><: :=":=:" ::></:>< /:>
?Respuestas:
Retina ,
7674 bytesComo he visto que la retina es realmente buena para las expresiones regulares de golf, pensé en probarla. Sigue la misma lógica que mi respuesta de Ruby e imprime 0 o 1.
Pruébalo en línea!
fuente
M`
. Si la etapa final solo tiene una sola parte, el modo partido está implícito.Ruby (2.3.1),
103101100 BytesFunción anónima llamada al agregar
.call("<Apple></Apple>")
. Sustituye las etiquetas coincidentes o de cierre automático hasta que no haya ninguna, y luego devuelve si la cadena no tiene corchetes angulares restantes.Pruébalo en línea!
fuente
<p title="This is a \"test\"."></p>
como Falsey, pero no debería serlo.