K’ak’-u-pakal과 마야 문자

시간 제한1초메모리 제한128 MB

요약
마야 상형문자 조합을 나타내는 재귀 문법을 해석해서 수평/수직 그룹 규칙과 괄호로 두 배 크기가 되는 규칙을 만족하는 최소 크기의 아스키 아트 레이아웃을 출력합니다.
난이도

어려움10점 중 9점

유형
재귀, 문자열, 구현, 시뮬레이션
정답자
아직 제출이 없습니다

문제

과학자들이 고대 마야 도시를 재발견했을 때, 알 수 없는 문자로 쓰인 많은 기록을 발견했다. 그 한 예가 고대 마야 도시 치첸이차(Chichén Itzá)의 군사 지도자이자 사제였던 K’ak’-u-pakal의 이름이다 (자세한 내용은 A. W. Voss, H. J. Kremer, K’ak’-u-pakal, Hun-pik-tok’ and the Kokom 참고). 이 상형문자는 도시 곳곳의 여러 유적에서 발견된다.

마야 상형문자는 엄밀한 의미의 상형문자가 아니라, 개별 글리프들을 조합한 것이다. 알려진 모든 글리프(약 천 개가 있다)에는 1부터 9999까지의 번호가 매겨져 있다. 글리프들의 상대적 위치를 부호화하는 특수한 언어를 사용하면 어떤 상형문자든 일반 텍스트로 표현할 수 있다. 예를 들어 위의 K’ak’-u-pakal 상형문자는 ((669:604).(586:(27:[(534.534)]))) 로 부호화된다. 이 언어의 형식 문법(대회에 맞게 각색됨)은 다음과 같다:

<inscription>      ::= <glyph-id>
                     | '(' <block> '.' <horizontal-group> ')'
                     | '(' <block> ':' <vertical-group> ')'
<horizontal-group> ::= <block> ['.' <horizontal-group>]
<vertical-group>   ::= <block> [':' <vertical-group>]
<block>            ::= <inscription> | '[' <inscription> ']'

부호화 문자열은 상형문자가 조합되는 과정을 나타낸다. 글리프들은 (. 또는 : 를 사용하여) 가로 또는 세로로 결합되어 블록을 이루고, 이 블록들은 다시 더 큰 블록으로 결합되어 원하는 구성이 완성될 때까지 반복된다.

주어진 부호화 문자열에 대해, 해당 상형문자의 배치를 ASCII 아트로 출력하라.

입력

첫 번째 줄에 공백이 없는 문자열 하나(최대 255자)가 주어진다. 이 문자열은 마야 상형문자 하나를 일반 텍스트 형태로 부호화한 것이다.

출력

배치를 출력한다. 출력은 문자 +, -, |, 공백(ASCII 코드 43, 45, 124, 32), 숫자 0-9, 그리고 줄바꿈으로 구성된다.

한 그룹 안의 모든 블록은 정확히 같은 크기여야 한다. 단, 대괄호로 둘러싸인 블록(그룹당 최대 하나)은 예외로, 정확히 두 배 넓어야 한다(그룹이 세로 방향이면 두 배 높아야 한다).

글리프 번호는 앞뒤에 공백을 하나씩 붙여서 해당 블록의 왼쪽 위 모서리에 배치한다. 출력의 크기(바이트 수)는 가능한 한 작아야 한다. 유효한 배치가 항상 존재하며, 그 크기는 최대 100000바이트임이 보장된다.

예제7

  1. 예제 1

    입력
    ((669:604).(586:(27:[(534.534)])))
    
    예상 출력
    +-----------+-----------+
    | 669       | 586       |
    |           |           |
    |           |           |
    |           |           |
    |           |           |
    +-----------+-----------+
    | 604       | 27        |
    |           +-----+-----+
    |           | 534 | 534 |
    |           |     |     |
    |           |     |     |
    +-----------+-----+-----+
    
  2. 예제 2

    입력
    1
    
    예상 출력
    +---+
    | 1 |
    +---+
    
  3. 예제 3

    입력
    (1.2)
    
    예상 출력
    +---+---+
    | 1 | 2 |
    +---+---+
    
  4. 예제 4

    입력
    (1:2)
    
    예상 출력
    +---+
    | 1 |
    +---+
    | 2 |
    +---+
    
  5. 예제 5

    입력
    (1.[2])
    
    예상 출력
    +---+-------+
    | 1 | 2     |
    +---+-------+
    
  6. 예제 6

    입력
    (1:[2])
    
    예상 출력
    +---+
    | 1 |
    +---+
    | 2 |
    |   |
    |   |
    +---+
    
  7. 예제 7

    입력
    ((1:2).3)
    
    예상 출력
    +---+---+
    | 1 | 3 |
    +---+   |
    | 2 |   |
    +---+---+