Isso se baseia em um desafio anterior excluído meu com o mesmo nome
Introdução
Você está encarregado de escrever um programa que retorne um valor de verdade ou falsey com base em se a entrada tiver todas as suas tags 1 semelhantes a XML adequadamente abertas e fechadas e na ordem correta. Considere o seguinte como entrada:
<Apple>
Isso retornaria um valor falsey porque a tag não foi fechada corretamente. Este:
<Apple></Apple>
Pelo contrário, retorna um valor verdadeiro porque está fechado corretamente. O programa também deve verificar as tags aninhadas para garantir que elas estejam na posição correta. Por exemplo, tome isso como entrada:
<mango><Apple></mango></Apple>
Todas as tags estão fechadas corretamente, mas não na ordem correta . Seu programa deve verificar a hierarquia e o aninhamento de tags corretos.
Definições
Deixe-me definir algumas coisas antes de entrar nas regras e suposições.
Tag
Uma tag básica no estilo XML. Por exemplo: <Apple>
. Eles podem ter, no máximo, um espaço inicial e final (ou é inválido e falsey), portanto, < Apple >
e <Apple>
são os mesmos. Essas tags também pode conter atributos como foo="bar"
(com aspas necessárias duplos, ou então inválida e Falsey) , e o nome do atributo só pode conter qualquer caractere alfanumérico ou _
, :
, -
, e .
. Os nomes de atributo também não exigem um valor de atributo, e os valores podem conter qualquer coisa, exceto "
antes da aspas duplas de fechamento. A tag de fechamento não deve conter atributos e nenhuma tag deve conter novas linhas.
Nome da tag
Nomes de tags são os nomes das tags. Por exemplo, <Apple>
o nome da tag é Apple
. Os nomes de tags podem conter os mesmos caracteres que os nomes de atributos e diferenciam maiúsculas de minúsculas. Isso significa que não<Apple>
é . <apple>
Etiqueta com fecho automático
Uma tag regular que se fecha como <Apple />
or <Apple/>
(eles são iguais). O espaço entre a barra e o nome da tag é permitido.
Texto simples
Uma sequência de caracteres que pode conter qualquer coisa e não está entre <
e >
.
Tag "Simples"
Uma tag de abertura, fechamento ou fechamento automático.
Regras
- A saída pode ser retornada ou impressa e a entrada pode ser feita da maneira que você quiser
- Entrada é uma cadeia de caracteres que consiste em tags, texto sem formatação ou ambos
Seu programa pode ser uma função ou um programa de trabalho inteiro
O texto sem formatação pode estar em qualquer lugar; se a entrada consistir apenas em texto sem formatação, o programa retornará um valor verdadeiro.
O reconhecimento de tags aninhadas é necessário para o programa. Se uma marca é aninhada em uma marca, essa marca aninhada deve ser fechada antes que o pai seja fechado, assim como o XML normal, ou então um valor falsey deve ser retornado
Suposições
- Você pode assumir que a entrada sempre será uma ou mais tags "simples"
- Você pode assumir que a entrada sempre seguirá o formato das tags definidas acima
Casos de teste
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>
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence. As brechas padrão são proibidas como de costume.
1 Nota : Este não é um XML real, mas um pseudo-XML com regras diferentes para o desafio. Os nomes de tags e atributos diferem da especificação.
< : : :><:/><: :=":=:" ::></:>< /:>
?