QOJ.ac

QOJ

Límite de tiempo: 3 s Límite de memoria: 512 MB Puntuación total: 100 Dificultad: [mostrar]

#1662. ASCII 自动机艺术

Estadísticas

本题的题目描述非常冗长,不需要背景故事。给定一个正则表达式,你的任务是按照题目说明中的规范,将其对应的自动机渲染为 ASCII 艺术图。请参考样例。

本题中的正则表达式由大写字母 A 到 Z、特殊字符 +、?、* 以及用于分组的括号组成。问题的输入由以下 BNF 文法中的 $\langle input \rangle$ 非终结符给出:

$\langle input \rangle ::= \langle expr \rangle$ $\langle expr \rangle ::= \langle term \rangle \mid \langle term \rangle \text{‘|’} \langle expr \rangle$ $\langle term \rangle ::= \langle atom \rangle \mid \langle atom \rangle \langle term \rangle \mid \langle term \rangle \langle atom \rangle$ $\langle atom \rangle ::= \langle letter \rangle \mid \text{‘(’} \langle expr \rangle \text{‘)’} \mid \langle atom \rangle \text{‘+’} \mid \langle atom \rangle \text{‘?’} \mid \langle atom \rangle \text{‘*’}$ $\langle letter \rangle ::= \text{‘A’} \mid \text{‘B’} \mid \dots \mid \text{‘Z’}$

正则表达式被渲染为一幅 ASCII 艺术图,需遵循以下精确规则。这些规则递归地定义了每个正则表达式的唯一表示,即一个具有指定行数和列数的矩形字符框。表示中的空字符(包括末尾的空字符)必须用空格填充。

由 $n$ 个大写字母组成的 $\langle term \rangle$ 被渲染为一个 3 行 $4+n$ 列的框,使用 + 和 - 字符在第一行、最后一行以及第一列和最后一列绘制边框,如样例所示。文法中 $\langle term \rangle$ 非终结符的产生式是有意模糊的。正则表达式中相邻的 $\langle letter \rangle$ 非终结符构成的最长序列必须被组合成一个 $\langle term \rangle$ 并渲染为一个单独的框。例如,‘NERC’ 的 $\langle term \rangle$ 渲染为如下 $3 \times 8$ 的框:

+------+
| NERC |
+------+

由 $\langle atom \rangle$ 非终结符和包含字母的 $\langle term \rangle$ 非终结符组成的 $\langle term \rangle$(如上所述),通过将组成框从左到右排列来渲染,垂直方向顶部对齐,相邻框之间用 2 列分隔。结果框的高度等于组成框的最大高度。每对相邻框通过在它们之间的列的第 2 行渲染 -> 字符来连接。例如,‘N(E)RC’ 的 $\langle term \rangle$(由序列:‘A’ 的 $\langle atom \rangle$、‘(E)’ 的 $\langle atom \rangle$ 和仅含字母的 ‘RC’ 的 $\langle term \rangle$ 组成)渲染为如下 $3 \times 20$ 的框:

+---+ +---+ +----+
+ N +->+ E +->+ RC +
+---+ +---+ +----+

由单个 $\langle term \rangle$ 组成的 $\langle expr \rangle$ 渲染为其对应的 $\langle term \rangle$。

由 ‘|’ 分隔的 $\langle term \rangle$ 非终结符序列组成的 $\langle expr \rangle$,通过将对应的 $\langle term \rangle$ 框从上到下排列来渲染,左对齐,相邻 $\langle term \rangle$ 框之间用一行分隔。结果框的宽度等于 $\langle term \rangle$ 框的最大宽度加 6。左侧有 3 个额外列,右侧有 3 个额外列。第一列和最后一列使用 + 和 | 字符将所有 $\langle term \rangle$ 框的第 2 行从上到下连接起来,并在每个 $\langle term \rangle$ 框的第 2 行放置 +。左侧的第 2、3 列和右侧的倒数第 2、3 列在对应 $\langle term \rangle$ 框的第 2 行有 -> 字符。此外,较短的 $\langle term \rangle$ 框在右侧用额外的 - 字符连接到第 2 行。例如,‘C|ON|TEST’ 的 $\langle expr \rangle$ 渲染为如下 $11 \times 14$ 的框:

+---+
+->+ C +---->+
| +---+ |
|       |
| +----+ |
+->+ ON +--->+
| +----+ |
|        |
| +------+ |
+->+ TEST +->+
+------+

‘(’ $\langle expr \rangle$ ‘)’ 的 $\langle atom \rangle$ 渲染为其对应的 $\langle expr \rangle$。

$\langle atom \rangle$ ‘+’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 2 行,宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列(从第 2 行开始)以及最后一行填充连接字符,如样例所示。 第 2 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。 最后一行以 +<- 开头,表示自动机中的反向边。

例如,‘A+’ 的 $\langle atom \rangle$ 渲染为如下 $5 \times 11$ 的框:

+---+
+->+ A +->+
| +---+ |
|       |
+<--------+

$\langle atom \rangle$ ‘?’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 3 行,宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列(从第 2 行到第 5 行)以及第 2 行填充连接字符,如样例所示。 ‘?’ 的 $\langle atom \rangle$ 的第一行始终为空(填充空格)。 第 2 行以 ->+ 结尾,表示对应自动机中的 epsilon 边。 * 第 5 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。

例如,‘B?’ 的 $\langle atom \rangle$ 渲染为如下 $6 \times 11$ 的框:

+-------->+
|         |
| +---+   |
+->+ B +->+
+---+

$\langle atom \rangle$ ‘’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 5 行(顶部 3 行,底部 2 行),宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列,以及第 2 行和最后一行,填充连接字符,如样例所示。 ’ 的 $\langle atom \rangle$ 的第一行始终为空(填充空格)。 第 2 行以 ->+ 结尾,表示对应自动机中的 epsilon 边。 第 5 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。 最后一行以 +<- 开头,表示自动机中的反向边。

例如,‘C*’ 的 $\langle atom \rangle$ 渲染为如下 $8 \times 11$ 的框:

+-------->+
|         |
| +---+   |
+->+ C +->+
| +---+   |
|         |
+<--------+

$\langle input \rangle$ 渲染为一个框,其宽度比对应的 $\langle expr \rangle$ 框多 6 列(左侧 3 列,右侧 3 列)。第 2 行以 S-> 开头表示自动机的起始状态,以 ->F 结尾表示自动机的最终状态。请参见样例输出。

输入格式

输入包含一行,对应于题目给出的文法中的 $\langle input \rangle$ 非终结符,长度不超过 100 个字符。

输出格式

在输出的第一行,写入两个整数 $h$ 和 $w$ —— 分别表示对应于给定 $\langle input \rangle$ 的 $h \times w$ 框的高度和宽度。在接下来的 $h$ 行中,每行写入对应 ASCII 艺术渲染的 $w$ 个字符。

样例

输入 1

NE?(ER)C++|(IS)*?|(CHA((LL))ENGING)

输出 1

23 57
+---+ +----+ +---+
S->+->+ N +->+-------->+->+ ER +->+->+->+ C +->+->+->+->F
| +---+ | | +----+ | | +---+ | | |
| | +---+ | | | | | |
| +->+ E +->+ | +<--------+ | |
| +---+ | | |
| +<--------------+ |
| |
| |
+->+--------------->+---------------------------->+
| | | |
| | | |
| +->+--------->+->+ |
| | | |
| | +----+ | |
| +->+ IS +->+ |
| | +----+ | |
| | | |
| +<---------+ |
| |
| +-----+ +----+ +--------+ |
+->+ CHA +->+ LL +->+ ENGING +------------------->+
+-----+ +----+ +--------+

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.