아날로그 시계 그리기
시간 제한1초메모리 제한128 MB
HH:MM 형식의 시각이 주어지면 시침과 분침을 선분으로 래스터화해 고정 크기 ASCII 아날로그 시계 문자판을 정해진 문자 규칙에 따라 그린다.
문제
우리의 낡은 시계가 네 시를 알리는 종을 친 뒤, 그 마지막 소리와 함께 나뭇가지 더미로 부서져 버렸습니다. 시계를 고치는 데 필요한 기술은 오래전에 잊혀 사라졌기에, 우리는 시계를 컴퓨터 프로그램으로 대체하기로 했습니다.
쉬운 일이라고요? 한 가지 더 말씀드릴 것이 있습니다. 최근 외계 생명체에 대한 연구에 따르면, 그들은 디지털 세계에 살고 있어 바늘 두 개가 움직이는 전통적인 시계판을 읽지 못한다고 합니다. 그것은 그들의 기술 수준을 넘어서는 일입니다. 그래서 보안 위원회는, 시간 정보를 인간이 아닌 존재로부터 지키기 위해 새 시계가 바로 그런 전통적인 "아날로그" 방식의 표시를 사용해야 한다고 결정했습니다.
입력
입력은 여러 개의 인스턴스로 이루어집니다. 각 인스턴스는 콜론으로 구분된 두 정수 H (0≤H≤23)와 M (0≤M≤59)이 한 줄에 주어집니다. M은 항상 두 자리로 주어지고, H는 한 자리 또는 두 자리입니다. 즉 H=0인 경우를 제외하면 앞에 0이 붙지 않습니다.
마지막 인스턴스 다음 줄에는 단어 END가 주어집니다.
출력
각 입력 인스턴스 H:M에 대해, H시 M분을 나타내는 ASCII 아트 시계판을 아래 규칙에 따라 그리세요.
시계의 테두리는 한 변이 51글자인 정사각형입니다. 이 글자들은 대문자 X이지만, 네 모서리와 열 번째마다 오는 글자는 항상 @입니다. 숫자 3, 6, 9, 12는 각각 알맞은 변의 가운데에 놓이며, 숫자와 테두리 사이에는 정확히 한 칸의 공백이 있습니다. 12에서는 두 숫자 1과 2 사이에 한 칸의 공백이 있습니다. 시계판의 중심에는 항상 별표 *가 놓입니다. 시각적으로 비어 있는 칸은 모두 단순한 공백입니다.
두 바늘은 시각에 따라 달라지는 유일한 요소입니다. 아래 설명에서는 각 글자 칸(공백이든 아니든)을 한 변이 1인 정사각형으로 보고, 좌표계의 원점 (0,0)을 별표가 있는 칸의 중심에 두며, 첫 번째 축은 오른쪽을, 두 번째 축은 위쪽을 향한다고 가정합니다.
시침은 (0,0)에서 시작하는 길이 15의 선분입니다. 12시에 똑바로 위를 가리키며, 매 분 같은 각도만큼 균일하게 회전합니다. 분침은 (0,0)에서 시작하는 길이 21의 선분으로, 매 정시마다 똑바로 위를 가리키고 역시 매 분 시계 방향으로 균일하게 회전합니다. 분침은 시침보다 위에 있다고 보므로, 시침을 나타내는 글자는 분침의 일부에 가려질 수 있습니다.
수직 방향과 이루는 각이 D도인 직선은 다음과 같이 그립니다. 0≤D≤45이면, 각 행 i마다 글자 하나를 찍되, 기하학적 직선 위에 정확히 놓인 점 (xi,i)(xi는 실수)에 가장 가까운 정수 좌표 (ni,i)에 찍습니다. 45≤D≤90이면, 각 열 i마다 글자 하나를 찍되, 직선 위의 실수 점 (i,yi)에 가장 가까운 정수 좌표 (i,ki)에 찍습니다.
어떤 위치 (i,j)에 그려지는 글자는 그 직선의 두 이웃 글자에 따라 결정됩니다. 그 글자는
- (i−1,j)와 (i+1,j) 두 위치에도 글자가 있으면 빼기 기호
-, - (i,j−1)와 (i,j+1) 두 위치에도 글자가 있으면 세로줄
|, - (i−1,j+1)와 (i+1,j−1) 위치에 글자가 있으면 역슬래시
\, - (i−1,j−1)와 (i+1,j+1) 두 위치에도 글자가 있으면 슬래시
/, - 그 외의 경우에는 소문자
o입니다.
(0,0)에서 시작하는 길이 S의 선분은 위와 똑같이 직선의 글자들을 만들되, 칸의 중심과 원점 사이의 거리가 S 이하인 글자, 즉 0<∣(0,0),(i,j)∣≤S인 글자만, 그리고 직선의 한쪽 방향으로만 찍어서 그립니다.
남은 애매한 부분은 예제 출력을 참고하여 해결하세요. 인접한 시계판 사이에는 빈 줄을 하나씩 넣어 구분합니다.
예제3
예제 1
입력1:03 14:27 END
예상 출력@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@ X X X 1 2 X X X X X X o X X | X X | X X o X X o X @ | @ X o X X o X X | o X X o o X X o o X X | o X X o / X X o o X X | o X @ o/ @ X oo X X |o X X o X X oo X X 9 * 3 X X X X X X X X X @ @ X X X X X X X X X X X X X X X X X X @ @ X X X X X X X X X X X X X X X 6 X X X @XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@ @XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@ X X X 1 2 X X X X X X X X X X X X X X X @ @ X X X X X X X X X X X X X X X X X X @ @ X o-- X X o-o X X o-o X X o--o X X 9 *o 3 X X o X X o X X | X X o X @ o @ X | X X o X X o X X | X X o X X o X X | X X o X X o X @ | @ X o X X o X X | X X | X X o X X X X X X 6 X X X @XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@
예제 2
입력10:10 END
예상 출력@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@ X X X 1 2 X X X X X X X X X X X X X X X @ @ X X X X X X X X X oo X X oo X X oo oo X X \ / X X oo oo X @ \ oo @ X oo / X X \ oo X X \ oo X X oo oo X X 9 * 3 X X X X X X X X X @ @ X X X X X X X X X X X X X X X X X X @ @ X X X X X X X X X X X X X X X 6 X X X @XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@
예제 3
입력0:00 END
예상 출력@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@ X X X 1 2 X X X X | X X | X X | X X | X X | X X | X @ | @ X | X X | X X | X X | X X | X X | X X | X X | X X | X @ | @ X | X X | X X | X X | X X 9 * 3 X X X X X X X X X @ @ X X X X X X X X X X X X X X X X X X @ @ X X X X X X X X X X X X X X X 6 X X X @XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@XXXXXXXXX@