Trong tác vụ này, bạn phải viết một chương trình đọc biểu thức chính quy và tạo một chương trình khác để xem liệu chuỗi đầu vào có được chấp nhận bởi biểu thức chính quy đó không. Đầu ra phải là một chương trình được viết bằng cùng ngôn ngữ với nội dung bạn gửi.
Đầu vào
Đầu vào là biểu thức chính quy r khớp với ABNF sau (quy tắc sản xuất ban đầu là REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
Nếu đầu vào không khớp với ngữ pháp này, hành vi của chương trình của bạn không được xác định.
Diễn dịch
Giải thích đầu vào dưới dạng một biểu thức chính quy, trong đó *
ngôi sao Kleene (có nghĩa là lặp lại đối số bên trái bằng 0 lần trở lên ), |
là một thay thế, (
và )
nhóm và không có toán tử nào được nối. Nhóm được ưu tiên hơn sao, sao được ưu tiên hơn so với ghép, ghép được ưu tiên thay thế.
Một chuỗi được cho là được chấp nhận nếu regex khớp với toàn bộ chuỗi.
Đầu ra
Đầu ra của chương trình là một chương trình khác được viết bằng cùng ngôn ngữ với nội dung gửi của bạn đọc một chuỗi s theo cách xác định trong thời gian chạy, xuất ra liệu r có chấp nhận s và sau đó chấm dứt. Đầu ra có thể được thực hiện theo cách do người dùng xác định mặc dù chỉ có hai đầu ra riêng biệt cho các chương trình được chấp nhận và bị từ chối.
Bạn có thể cho rằng đầu vào của chương trình đầu ra của bạn không bao giờ dài hơn 2 16 -1 byte.
Những hạn chế
Việc gửi của bạn cũng như bất kỳ chương trình nào được tạo bởi trình của bạn đều có thể sử dụng chức năng dựng sẵn hoặc thư viện
- chế độ phù hợp
- biến đổi biểu thức chính quy
- biên dịch biểu thức chính quy
- tạo các trình phân tích cú pháp từ một ngữ pháp
- đơn giản hóa vấn đề theo cách mà trình của bạn trở nên tầm thường
Chấm điểm
Điểm của bài nộp của bạn là số lượng ký tự. Bài nộp với số điểm thấp nhất sẽ thắng.
Tủ thử
Tất cả các testcase đều chứa một biểu thức chính quy, một chuỗi các chuỗi được chấp nhận, một chuỗi các chuỗi bị từ chối và một chương trình ví dụ trong C99 là đầu ra hợp lệ của một đệ trình C99 (giả thuyết).
(biểu thức chính quy trống)
Chuỗi được chấp nhận
- (đầu vào trống)
Chuỗi bị từ chối
- foo
- quán ba
- baz
- quux
Chương trình ví dụ
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
và b
xen kẽ)
chuỗi được chấp nhận
a
ba
abababababa
abab
chuỗi bị từ chối
afba
foo
babba
chương trình ví dụ
#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;
}
(0|1(0|1)*)(|A(0|1)*1)
(số dấu phẩy động nhị phân)
chuỗi được chấp nhận
- 10110100
- 0
- 1A00001
chuỗi bị từ chối
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
là không được phép.