Pact 해독기

아직 제출이 없습니다시간 제한1초메모리 제한256 MB

문제

Pact는 레코드, 배열, 문자열, 정수로 이루어진 자료 구조를 부호화하는 체계다. 부호화 결과는 출력 가능한 문자로만 이루어진 문자열이라서 파일에 쓰거나 네트워크로 보낼 수 있다. Pact는 하드웨어, 운영체제, 프로그래밍 언어에 의존하지 않는다. 부호화기는 이미 만들어져 있다. 해독기를 작성하라.

레코드는 이름이 붙은 구성 요소의 모음이다. 두 레코드는 이름이 같고 타입도 같은 구성 요소로 이루어져 있을 때 타입이 같다. 레코드에는 구성 요소가 하나 이상 있다.

배열은 1차원이고 0번부터 색인하며, 모든 원소의 타입이 같다. 배열에는 원소가 하나 이상 있다. 두 배열은 원소 타입이 같으면 타입이 같다. 즉 원소 타입이 같고 길이만 다른 두 배열도 타입이 같다.

기본 부호화 규칙은 다음과 같다.

정수는 숫자 문자열로 적고, 앞에 빼기 기호를 붙일 수 있다. 정수의 자릿수는 100 이하다.

12                ->  12
123456543254321   ->  123456543254321
-23               ->  -23

문자열은 출력 가능한 문자, 즉 영문자, 숫자, 문장 부호로만 이루어진다. 양쪽을 큰따옴표로 감싸서 부호화한다. 문자열 안의 큰따옴표 앞에는 역슬래시를 붙이고, 문자열 안의 역슬래시 앞에도 역슬래시를 붙인다.

Hello          ->  "Hello"
Say "Hello"    ->  "Say \"Hello\""
"\"Hello\""    ->  "\"\\\"Hello\\\"\""

배열은 0번 원소부터 마지막 원소까지 차례대로 부호화한 결과를 쉼표로 잇고, 양쪽을 세미콜론으로 감싼다.

[5,7,4,3]                 ->  ;5,7,4,3;
[red,green,blue]          ->  ;"red","green","blue";
[[1,2,3],[4,5,6],[7,8]]   ->  ;;1,2,3;,;4,5,6;,;7,8;;

레코드는 각 필드를 부호화한 결과를 쉼표로 잇고, 양쪽을 세미콜론으로 감싼다. 필드 하나는 필드 이름, 콜론, 값의 부호화 결과를 차례로 이어 적는다. 필드 이름은 영문자와 숫자로 이루어지고 영문자로 시작하며 대소문자를 구별한다. 한 레코드 안에서 이름이 같은 두 필드는 없다. 부호화 결과에서 필드는 어떤 순서로도 나올 수 있다.

(x:5,y:7,n5:Fred)   ->  ;x:5,y:7,n5:"Fred";

압축 규칙 두 가지가 이 기본 부호화를 바꾼다.

첫째, 배열에서 값이 같은 원소가 둘 이상 이어지면 그 값을 한 번만 적고 뒤에 별표와 반복 횟수를 적는다.

[5,5,5,7,6,6]           ->  ;5*3,7,6*2;
[(x:5,y:6),(x:5,y:6)]   ->  ;;x:5,y:6;*2;

둘째, 레코드로 이루어진 배열에서는 바로 앞 원소의 같은 이름 필드와 값이 같은 필드를 생략한다. 이 규칙은 배열의 최상위 레코드 원소에만 적용하며, 중첩된 레코드 안의 값을 골라서 생략하지는 않는다. 이 규칙 때문에 필드가 하나도 없는 레코드 부호화가 나오는 일은 없다.

[(x:5,y:6),(x:5,y:7)]                    ->  ;;x:5,y:6;,;y:7;;
[(x:5,y:6),(x:5,y:6)]                    ->  ;;x:5,y:6;*2;
[(a:5,b:(x:6,y:7)),(a:5,b:(x:6,y:8))]    ->  ;;a:5,b:;x:6,y:7;;,;b:;x:6,y:8;;;

입력

입력은 여러 개의 문제로 이루어진다. 각 문제의 첫 줄에는 양의 정수 N이 주어진다. 다음 줄에는 길이가 1,000 이하인 Pact 부호화 문자열이 주어진다. 이어서 N개의 줄에 검사가 한 줄에 하나씩 주어진다.

검사는 자료 접근식이다. 문자 v 뒤에 색인과 필드 선택자가 0개 이상 이어진다. 예를 들어 v, v[0].x, v.x.name, v.x.arr[5].str 같은 형태다.

색인 i는 정수 리터럴이고 0i1000 \le i \le 100이다. 접근식은 항상 문자열이나 정수에 도달하므로, 배열이나 레코드 전체를 가리키지 않는다. 접근식은 항상 부호화된 구조와 맞는다. 한 자료 구조에 들어 있는 문자열과 정수의 개수는 모두 합쳐 1,000 이하다.

N 자리에 0이 오면 입력이 끝난다.

출력

문제마다 Problem n 한 줄을 출력한다. n은 1부터 세는 문제 번호다. 이어서 N개의 줄에 각 검사가 도달한 문자열이나 정수를 출력한다. 문자열은 감싸는 큰따옴표와 탈출용 역슬래시를 빼고 출력한다. 정수는 부호화에 적힌 숫자 그대로 출력한다.