포스트스크립트 프린터 드라이버
시간 제한1초메모리 제한128 MB
60x60 격자에 C1 글꼴과 5x6 별표 글꼴 C5 문자열을 왼쪽, 오른쪽, 가운데, 절대 위치로 배치하는 페이지 렌더러를 구현한다. 공백과 점은 기존 칸을 덮어쓰지 않는다.
문제
때는 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열에서 시작하며, 인자들은 최소 한 칸의 공백으로 구분됩니다. 각 명령은 위 표에 나온 인자를 정확히 그대로 가집니다(빠지거나 남는 인자가 없고, 모든 값은 범위 안에 있습니다).
.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개의 대시(-)로 이루어진 줄 하나를 이어서 출력합니다.