휴먼 텍스트 또는 소스 코드와 같은 일부 종류의 데이터를 직선 문법으로 압축 할 수 있습니다. 기본적으로 언어에는 압축되지 않은 데이터라는 단어가 정확히 하나 인 문법이 작성됩니다. 이 작업에서는 이러한 데이터 압축 방법을 구현하는 프로그램을 작성해야합니다.
입력
입력은 65535 바이트 이하의 문자열입니다. 입력이 정규식과 일치 함을 보증합니다 [!-~]+
(즉, 공백을 제외하고 인쇄 가능한 ASCII 문자 하나 이상).
입력 예는 다음과 같습니다.
abcabcbcbcabcacacabcabab
산출
출력은 정확히 한 단어 (입력)를 설명하는 문법을 구성하는 규칙 집합입니다. 각 비 터미널은 9보다 큰 10 진수로 표시됩니다. 시작 기호는 기호 번호 10입니다. 입력 예에 해당하는 출력 예는 다음과 같습니다. 구문은 아래에 자세히 설명되어 있습니다.
10=11 11 12 12 11 13 13 11 14 14
11=a 12
12=b c
13=a c
14=a b
각 규칙은 <nonterminal>=<symbol> <symbol> ...
오른쪽에 임의의 공백으로 구분 된 수의 기호 가있는 형식 입니다. 다음 제한 사항을 준수하고 정확하게 입력 문자열을 도출하는 각 출력이 유효합니다.
제한 사항
사람들이 이상한 일을하는 것을 막기 위해 여러 가지 제한이 있습니다.
각 비 터미널은 규칙의 오른쪽에 두 번 이상 나타나야합니다. 예를 들어,
abcabc
규칙 12가 한 번만 나타나기 때문에 입력에 대한 다음 문법 은 유효하지 않습니다.10=12 11=a b c 12=11 11
두 개의 인접한 심볼 시퀀스는 겹치는 경우를 제외하고 모든 규칙의 모든 오른쪽에 두 번 이상 나타날 수 없습니다. 예를 들어, 입력에 대한 다음 문법
abcabcbc
은 시퀀스bc
가 두 번 나타나 므로 유효하지 않습니다.10=11 11 b c 11=a b c
유효한 문법은 다음과 같습니다.
10=11 11 12 11=a 12 12=b c
65535 바이트를 초과하지 않는 유효한 각 입력마다 1 분 이내에 프로그램을 종료해야합니다.
평소와 같이 솔루션을 사소하게 만들거나 많은 부분을 구현하는 언어 기능이나 라이브러리 기능을 사용할 수 없습니다.
샘플 입력
다음 C 프로그램으로 샘플 입력을 생성하십시오.
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
unsigned int i,j = 0,k;
if (argc != 3
|| 2 != sscanf(argv[1],"%u",&i)
+ sscanf(argv[2],"%u",&k)) {
fprintf(stderr,"Usage: %s seed length\n",argv[0]);
return EXIT_FAILURE;
}
srand(i);
while(j < k) {
i = rand() & 0x7f;
if (i > 34 && i != 127) j++, putchar(i);
}
return EXIT_SUCCESS;
}
위 프로그램에서 생성 된 샘플 입력은 일반적으로 압축 결과가 좋지 않습니다. 휴먼 텍스트 또는 소스 코드를 예제 입력으로 사용하십시오.
우승 기준
이것은 코드 골프입니다. 가장 짧은 소스 코드를 가진 프로그램이 승리합니다. 추가 크레딧을 얻으려면 출력의 입력을 재구성하는 프로그램을 작성하십시오.