- 22, Oct 2024
- #1
В этой задаче вам нужно написать программу, которая считывает регулярное выражение и генерирует другую программу, которая выводит информацию о том, принимается ли входная строка этим регулярным выражением. Результатом должна быть программа, написанная на том же языке, что и ваша заявка.
Вход
Входные данные представляют собой регулярное выражение р соответствующее следующему ABNF (исходное производственное правило
):(0|1(0|1)*)(|A(0|1)*1)
#include <stdio.h>
int main() {
char input[65536];
int state = 0;
for (;;) switch (state) {
case 0: switch (getchar()) {
case 'a': state = 1; break;
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 1: switch (getchar()) {
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 2: switch (getchar()) {
case 'a': state = 1; break;
case EOF: return 0;
default: return 1;
} break;
}
Если входные данные не соответствуют этой грамматике, поведение вашей программы не определено.
Интерпретация
Интерпретируйте ввод как регулярное выражение, где babba
is the Kleene-star (meaning повторить левый аргумент ноль или более раз), foo
is an alternative, afba
и abab
group and no operator at all concatenated. Grouping takes precedence over star, star takes precedence over concatenation, concatenation takes precedence over alternative.
Говорят, что строка принял если регулярное выражение соответствует всей строке.
Выход
Результатом работы программы является другая программа, написанная на том же языке, что и ваша заявка, которая читает строку. с определенным реализацией способом во время выполнения, выводит, р принимает с и затем прекращается. Вывод может выполняться способом, определяемым пользователем, хотя должно быть только два различных вывода для принятых и отклоненных программ.
Вы можете предположить, что входные данные вашей программы вывода никогда не длиннее 216-1 байт.
Ограничения
Ни ваша заявка, ни любая программа, созданная на основе вашей заявки, не может использовать встроенные функции или библиотеки, которые
- сопоставлять регулярные выражения
- преобразовывать регулярные выражения
- компилировать регулярные выражения
- генерировать парсеры из грамматики
- упростить задачу так, чтобы ваше представление стало тривиальным
Подсчет очков
Оценка вашего представления — это количество символов в нем. Побеждает работа с наименьшим количеством баллов.
Тестовые случаи
Все тестовые примеры содержат регулярное выражение, набор принятых строк, набор отклоненных строк и пример программы на C99, который является действительным результатом (гипотетической) отправки C99.
(пустое регулярное выражение)
Принятые строки
- (пустой ввод)
Отклоненные строки
- фу
- бар
- Баз
- Quux
Пример программы
abababababa
ba
( a
и b
alternating)
принятые строки
-
a
-
(b|)(ab)*(a|)
-
#include <stdio.h> int main() { char input[65536]; gets(input); return input[0] != 0; }
-
)
отклоненные строки
-
(
-
|
-
*
пример программы
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
REGEX
(binary floating point numbers)
принятые строки
- 10110100
- 0
- 1A00001
отклоненные строки
- 011
- 10А
- 1А00
- 100А010
#код-гольф #регулярное выражение #генерация кода #генерация