때는 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) | 설명 |
|---|---|---|---|---|---|
.P | C1 | C5 | 1 ~ 60 | 1 ~ 60 | 예 | 문자열을 절대 위치에 배치 |
.L | C1 | C5 | 1 ~ 60 | 예 | 문자열을 해당 행에 왼쪽 정렬 | |
.R | C1 | C5 | 1 ~ 60 | 예 | 문자열을 해당 행에 오른쪽 정렬 | |
.C | C1 | C5 | 1 ~ 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개의 대시(-)로 이루어진 줄 하나를 이어서 출력합니다.