Questo si basa su una mia precedente sfida eliminata con lo stesso nome
introduzione
Hai il compito di scrivere un programma che restituisca un valore di verità o di falso in base al fatto che l'input abbia tutti i suoi tag 1 simili a XML opportunamente aperti e chiusi e nel giusto ordine. Considerare quanto segue come input:
<Apple>
Ciò restituirebbe un valore false perché il tag non è stato chiuso correttamente. Questo:
<Apple></Apple>
Al contrario, restituisce un valore veritiero perché è chiuso correttamente. Il programma dovrebbe anche controllare i tag nidificati per assicurarsi che siano nella posizione corretta. Ad esempio, prendilo come input:
<mango><Apple></mango></Apple>
Tutti i tag sono chiusi correttamente, ma non nell'ordine corretto . Il programma deve verificare la gerarchia e l'annidamento dei tag corretti.
definizioni
Vorrei definire alcune cose prima di entrare nelle regole e nei presupposti.
Etichetta
Un tag di base in stile XML. Ad esempio: <Apple>
. Possono avere al massimo uno spazio iniziale e finale (altrimenti non è valido e falso), quindi < Apple >
e <Apple>
sono gli stessi. Questi tag possono anche contenere attributi come foo="bar"
(con le virgolette necessarie doppi, oppure non valida e Falsey) , e il nome attributo può contenere solo qualsiasi carattere alfanumerico o _
, :
, -
, e .
. Inoltre, i nomi degli attributi non richiedono un valore di attributo e i valori possono contenere qualsiasi cosa tranne che "
prima della doppia virgoletta di chiusura. Il tag di chiusura non deve contenere attributi e nessun tag deve contenere righe.
Nome tag
I nomi dei tag sono i nomi dei tag. Ad esempio, <Apple>
il nome del tag è Apple
. I nomi dei tag possono contenere gli stessi caratteri dei nomi degli attributi e sono sensibili al maiuscolo / minuscolo. Questo significa che non lo<Apple>
è . <apple>
Etichetta a chiusura automatica
Un tag normale che si chiude come <Apple />
o <Apple/>
(sono gli stessi). Lo spazio tra la barra e il nome del tag è consentito.
Testo semplice
Una stringa di caratteri che può contenere qualsiasi cosa e non è racchiusa tra <
e >
.
Tag "semplice"
Un tag di apertura, chiusura o chiusura automatica.
Regole
- L'output può essere restituito o stampato e l'input può essere preso come preferisci
- L'input è una stringa, costituita da tag, testo semplice o entrambi
Il tuo programma può essere una funzione o un intero programma di lavoro
Il testo semplice può essere ovunque; se l'input è costituito solo da testo semplice, il programma dovrebbe restituire un valore di verità.
Il riconoscimento dei tag nidificati è necessario per il programma. Se un tag è nidificato in un tag, quel tag nidificato deve essere chiuso prima della chiusura del genitore, proprio come il normale XML, altrimenti dovrebbe essere restituito un valore false
ipotesi
- Puoi presumere che l'input sarà sempre uno o più tag "semplici"
- Puoi supporre che l'input segua sempre il formato per i tag definiti sopra
Casi 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>
punteggio
Questo è code-golf , quindi vince il codice più breve in byte. Le scappatoie standard sono vietate come al solito.
1 Nota : questo non è un vero XML, ma uno pseudo-XML con regole diverse per la sfida. I nomi di tag e attributi differiscono dalle specifiche.
< : : :><:/><: :=":=:" ::></:>< /:>
?