Feche suas tags!

13

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

Andrew Li
fonte
Se uma tag tiver mais de um espaço antes ou depois dela, precisamos marcá-la como falsa?
JayDepp
@JayDepp Sim - deixe-me esclarecer que no meu post #
Andrew Li
Podemos usar builtins que analisam cadeias de caracteres para XML?
Oliver
@obarakon O problema é que isso não é necessariamente XML válido. Veja a nota de rodapé.
Andrew Li
É correto dizer que este é um input truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Respostas:

2

Retina , 76 74 bytes

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

^[^<>]*$

Desde que eu vi que a retina é realmente boa para regexes de golfe, achei que tentaria. Segue a mesma lógica da minha resposta Ruby e imprime 0 ou 1.

Experimente online!

JayDepp
fonte
1
Você não precisa do M`. Se a etapa final tiver apenas uma parte, o modo de correspondência estará implícito.
Martin Ender
1

Ruby (2.3.1), 103 101 100 Bytes

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

Função anônima chamada anexando .call("<Apple></Apple>"). Substitui as tags correspondentes ou de fechamento automático até que não haja nenhuma e, em seguida, retorna se a sequência não possui colchetes angulares.

Experimente online!

JayDepp
fonte
Isso marca <p title="This is a \"test\"."></p>como Falsey, mas não deveria ser.
orlp 30/12/16
Os valores @orlp 'podem conter qualquer coisa, exceto "antes da aspas duplas de fechamento".
JayDepp
Ah, não é XML real ...
orlp 30/12/16
1
XML real nunca deve ser analisado com regex :)
JayDepp