포스트스크립트 프린터 드라이버

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

문제

때는 1976년, 한 작은 신생 회사가 최초의 (조금은 조잡한) 레이저 포스트스크립트 프린터를 막 만들었습니다. 당신은 이 프린터의 디바이스 드라이버 Release 1을 작성하기 위해 고용되었습니다. 이 업계의 일부 회의론자들은 포스트스크립트 프린터가 결코 성공하지 못할 것이라고 믿기에, Release 1은 아주 단순한 두 개의 글꼴만 지원하도록 의도적으로 제한되어 있습니다.

디바이스 드라이버는 출력 페이지 위에 문자를 어디에 배치할지 기술하는 일련의 명령을 읽어들입니다. (그래픽은 Release 2에서 지원될 예정입니다.) 각 페이지는 60 x 60 크기의 문자 칸 격자입니다. 각 칸에는 다음 문자 중 하나만 들어갈 수 있습니다.

ABCDEFGHIJKLMNOPQRSTUVWXYZ .*

위의 알파벳 대문자 26개와 공백이 첫 번째 글꼴 C1의 문자 집합을 이룹니다. 별표(*)는 확대된 Courier 글꼴 C5를 그리는 기본 픽셀입니다. 각 C5 문자는 별표(*)와 마침표(.)로 이루어진 5행 x 6열 격자에 그려집니다. C5 문자는 다음과 같습니다.

.***..  ****..  .****.  ****..  *****.  *****.  .****.  *...*.  *****.
*...*.  *...*.  *...*.  *...*.  *.....  *.....  *.....  *...*.  ..*...
*****.  ****..  *.....  *...*.  ***...  ***...  *..**.  *****.  ..*...
*...*.  *...*.  *.....  *...*.  *.....  *.....  *...*.  *...*.  ..*...
*...*.  ****..  .****.  ****..  *****.  *.....  .***..  *...*.  *****.
  A       B       C       D       E       F       G       H       I

..***.  *...*.  *.....  *...*.  *...*.  .***..  ****..  .***..  ****..
...*..  *..*..  *.....  **.**.  **..*.  *...*.  *...*.  *...*.  *...*.
...*..  ***...  *.....  *.*.*.  *.*.*.  *...*.  ****..  *...*.  ****..
*..*..  *..*..  *.....  *...*.  *..**.  *...*.  *.....  *..**.  *..*..
.**...  *...*.  *****.  *...*.  *...*.  .***..  *.....  .****.  *...*.
  J       K       L       M       N       O       P       Q       R

.****.  *****.  *...*.  *...*.  *...*.  *...*.  *...*.  *****.  ......
*.....  *.*.*.  *...*.  *...*.  *...*.  .*.*..  .*.*..  ...*..  ......
.***..  ..*...  *...*.  .*.*..  *.*.*.  ..*...  ..*...  ..*...  ......
....*.  ..*...  *...*.  .*.*..  **.**.  .*.*..  ..*...  .*....  ......
****..  .***..  .***..  ..*...  *...*.  *...*.  ..*...  *****.  ......
  S       T       U       V       W       X       Y       Z     blank

각 C5 문자의 여섯 번째 열은 모두 마침표라는 점에 유의하세요. 이는 문자열에서 글자 사이의 자연스러운 간격을 만들어 줍니다.

드라이버는 입력에서 서식 명령을 읽어, 모든 칸이 마침표(.)로 채워진(즉, 빈 종이) 60 x 60 격자 위에 글꼴 C1과 C5의 문자를 그립니다. 각 명령은 어떤 칸이든 바꿀 수 있으며, 이미 그려진 칸을 덮어쓸 수도 있습니다. 다만 두 글꼴의 공백 문자와 C5 글리프 안의 빈 칸(마침표)은 칸에 이미 있는 내용을 덮어쓰지 않습니다. 페이지의 좌우 옆이나 아래로 벗어나는 서식은 그냥 잘려 나갑니다. 서식 처리는 페이지 끝(end-of-page) 명령을 만날 때까지 계속됩니다.

입력은 한 줄에 정확히 하나의 명령과 그 인자로 이루어진 여러 줄입니다. 모든 명령은 1열에서 마침표로 시작하며, 그 뒤에 0개에서 4개의 인자가 옵니다. 명령은 다음과 같습니다.

명령인자 1: 글꼴 (F)인자 2: 행 (R)인자 3: 열 (C)인자 4: 문자열 (S)설명
.PC1 | C51 ~ 601 ~ 60문자열을 절대 위치에 배치
.LC1 | C51 ~ 60문자열을 해당 행에 왼쪽 정렬
.RC1 | C51 ~ 60문자열을 해당 행에 오른쪽 정렬
.CC1 | C51 ~ 60문자열을 해당 행에 가운데 정렬
.EOP아니오페이지 끝

모든 명령은 1열에서 시작하며, 인자들은 최소 한 칸의 공백으로 구분됩니다. 각 명령은 위 표에 나온 인자를 정확히 그대로 가집니다(빠지거나 남는 인자가 없고, 모든 값은 범위 안에 있습니다).

  • .P (배치): 글꼴 F로 문자열을 그리되 왼쪽 위 모서리를 (R, C)에 둡니다. 첫 글자가 (R, C)에 오고 나머지는 오른쪽으로 이어집니다.
  • .L (왼쪽 정렬): 글꼴 F로 문자열을 그리되 왼쪽 위 모서리를 (R, 1)에 둡니다.
  • .R (오른쪽 정렬): 글꼴 F로 문자열을 그리되 오른쪽 위 모서리를 (R, 60)에 둡니다. 마지막 글자가 60열에서 끝나고 문자열은 왼쪽으로 이어집니다.
  • .C (가운데 정렬): 글꼴 F로 문자열을 가로로 가운데 정렬하며, 문자열의 맨 윗줄을 R행에 둡니다. 정확히 가운데에 놓을 수 없으면(문자열이 홀수 개의 칸을 차지하면) 31열을 기준으로 양쪽에 똑같이 나누어 가운데 정렬합니다.
  • .EOP (페이지 끝): 드라이버가 버퍼를 비우며(페이지를 출력하며) 다음 줄부터 새 빈 페이지에 서식을 시작합니다. .EOP는 입력의 마지막 명령임이 보장됩니다.

인자 1은 글꼴입니다. 인자 2는 행 R입니다(C5의 경우 글리프가 R행부터 R+4행까지 차지합니다). 인자 3은 있는 경우 문자열의 가장 왼쪽 열입니다. 인자 4는 최대 60개의 유효한 문자(대문자 또는 공백)로 이루어진 문자열이며, 양쪽이 |로 구분됩니다.

입력

입력은 한 줄에 하나씩 주어지는 명령과 그 인자들로 이루어집니다. 빈 종이에서 시작하여 파일 끝까지 명령을 읽어 서식을 처리하고, 페이지 끝 명령마다 페이지를 출력(flush)하세요.

출력

.EOP 명령에서 현재 페이지를 나타내는 60 x 60 격자를 출력하세요. 페이지의 끝을 표시하기 위해, 각 페이지 뒤에 빈 줄 하나와 60개의 대시(-)로 이루어진 줄 하나를 이어서 출력합니다.