Chiudi i tuoi tag!


13

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


Se un tag ha più di uno spazio prima o dopo di esso, dobbiamo contrassegnarlo come falso?
JayDepp,

@JayDepp Sì - fammi chiarire che nel mio post
Andrew Li, il

Possiamo usare i builtin che analizzano le stringhe in XML?
Oliver,

@obarakon Il problema è che questo non è necessariamente un XML valido. Vedi la nota a piè di pagina.
Andrew Li,

È corretto affermare che si tratta di un input veritiero : < : : :><:/><: :=":=:" ::></:>< /:>?
inserireusernamehere

Risposte:


2

Retina , 76 74 byte

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

^[^<>]*$

Da quando ho visto che la retina è davvero buona per le regex del golf, ho pensato di provarlo. Segue la stessa logica della mia risposta di Ruby e stampa 0 o 1.

Provalo online!


1
Non hai bisogno del M`. Se la fase finale ha solo una parte, è implicita la modalità match.
Martin Ender,

1

Ruby (2.3.1), 103 101 100 byte

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

Funzione anonima chiamata aggiungendo .call("<Apple></Apple>"). Sostituisce i tag corrispondenti o che si chiudono automaticamente fino a quando non sono presenti, quindi restituisce se la stringa non ha parentesi angolari rimanenti.

Provalo online!


Questo segna <p title="This is a \"test\"."></p>come Falsey, ma non dovrebbe essere.
orlp

I valori di @orlp possono contenere qualsiasi cosa tranne "prima della doppia virgoletta di chiusura".
JayDepp,

Oh, non è un vero XML ...
orlp

1
Il vero XML non dovrebbe mai essere analizzato con regex :)
JayDepp il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.