Ваше завдання - створити програму, яка визначає, чи задана рядок є дійсним регулярним виразом чи не використовує фрагменти коду, що походять з сайтів мережі StackExchange.
Для цілей цього завдання, регулярний вираз говір буде урізана і в основному мінімальний набір мета-символів: ()*?|\
. Таким чином, ви не зможете використовувати вбудовані парсекс-аналізатори.
\
використовується для втечі мета-символів. За ним повинен дотримуватися мета-символ.- Нескорочені дужки повинні бути збалансованими
*
і?
йому передує або немета-символ, або кругла група, або мета-символ, що уникнув.- Усі інші символи ASCII для друку, а також нова лінія, вкладка та пробіл повинні підтримуватися як неметалічні символи. Що відбувається з рядком, що містить інші символи, не визначено.
- Справжнє значення регулярного вираження не важливе для цього завдання.
Приклади
Truthy:
abc
a?
(a|)*
()
a|b*
\*
\\
\\*
a*b?(cd|e)
+
[
}
(123\))*
\|
(a(b(c|d)*e)*f)*
(|\)*)
(abc)+*
(abc)+
+abc
^ last test case is an actual newline
Falsy:
?abc
*
**
\
(
a*?
a?*
?
a)
(\)
(|\)*
\()
|*
(?:abc)
\\**
\n
Оцінка балів
Ваш загальний бал - це кількість фрагментів, взятих із запитань та відповідей навколо StackExchange.
- Повторні фрагменти рахуються стільки ж разів, скільки вони використовуються.
- Простір можна додавати та видаляти вільно (через Python, Haskell та інших мов, чутливих до пробілів) і не зараховується до вашої кількості фрагментів.
- Виняток буде, якщо ваш код фактично написаний на Whitespace .
- Фрагменти дозволено з будь-якого сайту StackExchange, якщо вони походять із питань, відповідей та коментарів, які старіші (включаючи час редагування - використовуйте старі версії, якщо потрібно), ніж це завдання. (24 вересня 2019 р., 15:30 UTC)
- Фрагменти можуть надходити з будь-якого місця запитання, відповіді чи коментаря, будь то в попередньо відформатованому блоці коду чи ні.
- Злиття фрагмента посередині іншого призводить до того, що зовнішній фрагмент вважається двома фрагментами
Найнижчий рахунок виграє!