Закройте ваши теги!

13

Это основано на моем предыдущем удаленном вызове с тем же именем

Вступление

Перед вами стоит задача написать программу, которая возвращает истинное или ложное значение, основываясь на том, что вход имеет все свои XML-подобные теги 1, соответственно открытые и закрытые и в правильном порядке. Рассмотрим следующее как ввод:

<Apple>

Это вернет значение Falsey, потому что тег не закрыт правильно. Эта:

<Apple></Apple>

Напротив, возвращает истинное значение, потому что оно закрыто правильно. Программа также должна проверять вложенные теги, чтобы убедиться, что они находятся в правильном положении. Например, возьмите это как ввод:

<mango><Apple></mango></Apple>

Все теги закрыты правильно, но не в правильном порядке . Ваша программа должна проверить правильность иерархии тегов и вложенности.

Определения

Позвольте мне определить несколько вещей, прежде чем я войду в правила и предположения.

Тег

Базовый тег в стиле XML. Например: <Apple>. Они могут иметь в лучшем случае , один передние и заднее пространство (или же это недопустимое и falsey), так < Apple >и <Apple>то же. Эти метки могут также содержать атрибуты , такие как foo="bar" (с требуемыми двойными кавычками, либо недействительным и falsey) , и имя атрибута может содержать только любой алфавитно - цифровой символ или _, :, -, и .. Имена атрибутов также не требуют значения атрибута, и значения могут содержать что угодно, кроме "закрывающей двойной кавычки. Закрывающий тег не должен содержать атрибутов, и ни в одном теге не должно быть новых строк.

Название тэга

Имена тегов - это имена тегов. Например, <Apple>имя тега 's Apple. Имена тегов могут содержать те же символы, что и имена атрибутов, и чувствительны к регистру. Это означает , что <Apple>это не <apple> .

Самозакрывающийся тег

Обычный тег, который закрывает себя, такой как <Apple />или <Apple/>(они одинаковы). Пробел между косой чертой и именем тега разрешен.

Простой текст

Строка символов, которая может содержать что угодно и не заключена в <и >.

«Простой» тег

Либо открывающий, закрывающий, либо самозакрывающийся тег.

правила

  • Вывод может быть возвращен или распечатан, а ввод может быть принят любым способом
  • Ввод - это строка, состоящая из тегов, простого текста или обоих
  • Ваша программа может быть функцией или целой рабочей программой

  • Обычный текст может быть где угодно; если ввод состоит только из простого текста, программа должна вернуть истинное значение.

  • Для программы требуется распознавание вложенных тегов. Если тег вложен в тег, этот вложенный тег должен быть закрыт до закрытия родительского элемента, как обычный XML, иначе должно быть возвращено значение Falsey.

Предположения

  • Вы можете предположить, что ввод всегда будет одним или несколькими «простыми» тегами
  • Вы можете предположить, что ввод всегда будет следовать формату для тегов, определенных выше

Тестовые случаи

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>

счет

Это , поэтому выигрывает самый короткий код в байтах. Стандартные лазейки , как обычно, запрещены.


1 Примечание : это не настоящий XML, а псевдо-XML с другими правилами для вызова. Имена тегов и атрибутов отличаются от спецификации.

Эндрю Ли
источник
Если тег имеет больше одного пробела до или после него, нужно ли помечать его как ложный?
JayDepp
@JayDepp Да - позвольте мне уточнить это в моем посте
Эндрю Ли
Можем ли мы использовать встроенные функции, которые анализируют строки в XML?
Оливер
@obarakon Проблема в том, что это не обязательно допустимый XML. Смотрите сноску.
Эндрю Ли
Правильно ли сказать, что это вход truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusername здесь

Ответы:

2

Сетчатка , 76 74 байта

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

^[^<>]*$

Поскольку я видел, что сетчатка действительно хороша для регулярных выражений в гольфе, я решил попробовать. Следует той же логике, что и мой ответ Ruby, и выдает 0 или 1.

Попробуйте онлайн!

JayDepp
источник
1
Вам не нужно M`. Если на последнем этапе есть только одна часть, подразумевается режим соответствия.
Мартин Эндер
1

Рубин (2.3.1), 103 101 100 байт

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

Анонимная функция, вызываемая добавлением .call("<Apple></Apple>"). Подставляет совпадающие или самозакрывающиеся теги до тех пор, пока их нет, а затем возвращает, не осталось ли в строке угловых скобок.

Попробуйте онлайн!

JayDepp
источник
Это помечает <p title="This is a \"test\"."></p>как Фолси, но это не должно быть.
orlp
@orlp 'значения могут содержать что угодно, кроме "перед закрывающей двойной кавычкой.'
JayDepp
О, это не настоящий XML ...
orlp
1
Настоящий XML никогда не должен анализироваться с помощью регулярных выражений :)
JayDepp