Cierra tus etiquetas!

13

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

Andrew Li
fuente
Si una etiqueta tiene más de un espacio antes o después, ¿debemos marcarla como falsa?
JayDepp
@ JayDepp Sí, déjenme aclarar eso en mi publicación
Andrew Li, el
¿Podemos usar construcciones que analicen cadenas a XML?
Oliver
@obarakon El problema es que esto no es necesariamente XML válido. Ver la nota al pie.
Andrew Li
¿Es correcto decir, que se trata de una entrada de Truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Respuestas:

2

Retina , 76 74 bytes

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

^[^<>]*$

Como 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!

JayDepp
fuente
1
No necesitas el M`. Si la etapa final solo tiene una sola parte, el modo partido está implícito.
Martin Ender
1

Ruby (2.3.1), 103 101 100 Bytes

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

Funció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!

JayDepp
fuente
Esto marca <p title="This is a \"test\"."></p>como Falsey, pero no debería serlo.
orlp
@orlp 'los valores pueden contener cualquier cosa excepto "antes de la comilla doble de cierre".
JayDepp
Oh, no es XML real ...
orlp
1
XML real nunca debe analizarse con
expresiones