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


13

Це ґрунтується на попередньому видаленому моєму виклику з тим же ім’ям

Вступ

Вам покладено завдання написати програму, яка повертає значення truthy або falsey на основі, якщо вхід має всі свої теги, схожі на XML, 1 належним чином відкриті та закриті та в правильному порядку. Розглянемо як вхідне:

<Apple>

Це поверне значення фальси, оскільки тег неправильно закритий. Це:

<Apple></Apple>

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

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

Усі теги закриті правильно, але не в правильному порядку . Ваша програма повинна перевірити правильність ієрархії тегів та вкладення.

Визначення

Дозвольте мені визначити кілька речей, перш ніж потрапити в правила і припущення.

Тег

Основний тег у стилі XML Наприклад: <Apple>. Вони можуть мати в кращому випадку , один передні і задній простір (або ж це неприпустиме і falsey), так < Apple >і <Apple>те ж. Ці мітки можуть також містити атрибути , такі як foo="bar" (з необхідними подвійними лапками, або недійсним і falsey) , і ім'я атрибута може містити тільки будь-який алфавітно - цифровий символ або _, :, -, і .. Імена атрибутів також не потребують значення атрибута, і значення можуть містити що завгодно, крім "перед закриттям подвійної лапки. Закриваючий тег не повинен містити атрибутів, і жодні теги не повинні містити в них нових рядків.

Назва тегу

Імена тегів - це назви тегів. Наприклад, <Apple>ім'я тегу - це Apple. Імена тегів можуть містити ті самі символи, що імена атрибутів, і залежно від регістру. Це означає <Apple>, що ні <apple> .

Тег самозакриття

Звичайний тег, який закриває себе таким, як <Apple />або <Apple/>(вони однакові). Місця між косою рисою та назвою тегу дозволено.

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

Рядок символів, який може містити що завгодно і не вкладений у <та >.

"Простий" тег

Або тег відкриття, закриття або самозакриваючись.

Правила

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

  • Звичайний текст може бути де завгодно; якщо вхід складається лише з простого тексту, програма повинна повернути просте значення.

  • Розпізнавання вкладених тегів потрібно для програми. Якщо тег вкладено в тег, той вкладений тег повинен бути закритий до того, як батьківський закритий, як і звичайний XML, інакше слід повернути значення фальси.

Припущення

  • Ви можете припустити, що вхід завжди буде одним або декількома "простими" тегами
  • Можна припустити, що введення завжди буде відповідати формату тегів, визначених вище

Випробування

Фальсі

<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 : < : : :><:/><: :=":=:" ::></:>< /:>?
вставитикористувач туди

Відповіді:


2

Сітківка , 76 74 байт

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

^[^<>]*$

Оскільки я бачив, що сітківка справді гарна для рефлексів для гольфу, я подумав, що спробую це. Дотримується тієї ж логіки, що і моя відповідь Рубі, і друкує 0 або 1.

Спробуйте в Інтернеті!


1
Вам це не потрібно M`. Якщо заключний етап має лише одну частину, мається на увазі режим відповідності.
Мартін Ендер

1

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

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

Анонімна функція викликається додаванням .call("<Apple></Apple>"). Заміни, які відповідають або самозакриваються тегами, поки їх немає, а потім повертають, чи немає в рядку кутових дужок.

Спробуйте в Інтернеті!


Це позначає <p title="This is a \"test\"."></p>Фальсі, але цього не повинно бути.
orlp

@orlp 'значення можуть містити що завгодно, крім "перед заключною подвійною цитатою".
JayDepp

О, це не справжній XML ...
orlp

1
Справжній XML ніколи не слід розбирати з регулярним виразом :)
JayDepp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.