Це ґрунтується на попередньому видаленому моєму виклику з тим же ім’ям
Вступ
Вам покладено завдання написати програму, яка повертає значення 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 з різними правилами для виклику. Імена тегів та атрибутів відрізняються від специфікації.
< : : :><:/><: :=":=:" ::></:>< /:>
?