이 작업에서는 정규식을 읽고 입력 문자열이 해당 정규식에 의해 허용되는지 여부를 출력하는 다른 프로그램을 생성하는 프로그램을 작성해야합니다. 출력물은 제출물과 동일한 언어로 작성된 프로그램이어야합니다.
입력
입력은 다음 ABNF와 일치하는 정규식 r입니다 (초기 생산 규칙은 REGEX
) :
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
입력이이 문법과 일치하지 않으면 프로그램의 동작이 정의되지 않습니다.
해석
입력을 정규식으로 해석하십시오. 여기서 *
Kleene-star ( 왼쪽 인수를 0 번 이상 반복 함 ) |
는 대안 (
이며 )
그룹이며 연산자가 전혀 연결되어 있지 않습니다. 그룹화는 별보다 우선하고, 별은 연결보다 우선하고, 연결은 대안보다 우선합니다.
정규식이 전체 문자열과 일치하면 문자열이 허용 된다고 합니다.
산출
이 프로그램의 출력 문자열 읽어 제출과 같은 언어로 작성된 다른 프로그램 들 실행시에 구현 정의 된 방식으로, 여부를 출력 r은 받아 들 다음과이 종료됩니다. 수락 및 거부 된 프로그램에 대해 두 개의 고유 한 출력 만 있어야하지만 사용자 정의 방식으로 출력을 수행 할 수 있습니다.
출력 프로그램의 입력이 2 16 -1 바이트 보다 길지 않다고 가정 할 수 있습니다 .
제한 사항
제출물이나 제출물로 생성 된 프로그램은 내장 기능이나 라이브러리를 사용할 수 없습니다.
- 정규식 일치
- 정규식 변환
- 정규식 컴파일
- 문법에서 파서를 생성
- 제출물이 사소한 방식으로 문제를 단순화
채점
제출 점수는 제출 한 문자 수입니다. 가장 낮은 점수를받은 제출이 승리합니다.
테스트 케이스
모든 테스트 케이스에는 정규식, 허용되는 문자열 세트, 거부 된 문자열 세트 및 C99의 예제 프로그램이 포함되어 있으며 (가상적인) C99 제출의 올바른 출력입니다.
(빈 정규식)
허용되는 문자열
- (빈 입력)
거부 된 문자열
- 푸
- 바
- 바즈
- quux
프로그램 예
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
그리고 b
교대로)
허용되는 문자열
a
ba
abababababa
abab
거부 된 문자열
afba
foo
babba
예제 프로그램
#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)
(이진 부동 소수점 숫자)
허용되는 문자열
- 10110100
- 0
- 1A00001
거부 된 문자열
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
수 없다고 생각합니다.