翻译:
你需要写一个公式编辑器(就像 Word 的公式一样)。
一个公式可以被看做一些元素,有三种元素:基本元素(数字,字母,括号和算术运算符),分式和矩阵。
每一个元素(基本元素、矩阵的所有单元格,分式的分子和分母)都有一个编辑框,如下图所示:

F1 是整个公式,它是一个特殊的编辑框。
因为矩阵的每个单元格都是一个元素,所以存在 F2 和 F3。
类似的,分子和分母都有一个编辑框,所以存在 F4 和 F5.
可以看到编辑框是嵌套的。如果框 A 直接包含框 B,那么我们就称框 A 是框 B 的父框(例如,F1 是 F2 和 F3 的父框,F3 是 F4 和 F5 的父框;如果框 A 和框 B 有相同的父框,我们说它们是同级框(例如,F4 和 F5 是同级框,F2 和 F3 也是同级框)。
在任何时候,光标总是直接包含在框中。它可能位于框中所有元素的左侧(即首部位置),也可能位于所有元素的右侧(即尾部位置),或者位于两个连续元素之间。如果光标位于元素 x 和 y 之间,x 在左边,y 在右边),我们说光标的直接左侧元素是 x,直接右侧元素是 y。
光标支持 6 种移动:Home, End, Up, Down, Left, Right,假设 A 是包含光标的最小的框,则:
Home/End:将光标移动至 A 的首部位置/尾部位置。
Up/Down:如果 A 的上方/下方有一个同级框 B,则将光标放在 B 的首部位置,否则查看 A 的父框(如果 A 的父框有同级框,则移至该框的首部位置)。如果 A 的所有祖先框中都没有这样的同级框,不执行任何操作。
Left/Right:有四种情况:
如果光标位于 A 的首部位置/尾部位置,则将光标移动至 A 的左/右同级编辑框 B 的尾部位置/首部位置。如果没有这样的 B,则将光标直接放置在 A 的父框 C 中,放置在 A 的直接左侧元素/直接右侧元素,如果还是没有,不执行任何操作。
如果光标的直接左侧元素/直接右侧元素是分数,则将光标放在分子的尾部位置/首部位置。
如果光标的直接左侧元素/直接右侧元素是一个 n 行 m 行的矩阵,则将光标放置在第 ⌊2n⌋ 行和第 1 列/第 m 列对应的编辑框的尾部位置/首部位置。
如果光标的直接左侧元素/直接右侧元素是基本元素,则将光标放在该元素的直接左侧位置/直接右侧位置。
输入有很多条命令。对于每个命令:
如果包含单个字符,则其为一定基本元素。在光标处插入该元素,并将光标移到其右侧。
如果是 Matrix 或 Fraction,则在光标处插入 1×1 矩阵或空分式,然后向右移动光标。请注意,在向右移动光标之前,新的矩阵/分数位于光标的右侧。
如果是 AddRow 或 AddCol,则在直接包含光标的框前插入一行/列,并将光标放置在同一列/行的新行/列中。如果框不是矩阵单元,请查看其父框,直到找到矩阵单元。如果没有包含光标的矩阵单元格,则忽略此命令。
如果是 Home, End, Up, Down, Left, Right 中的一个,根据上面的规则移动光标。
你需要输出一个字符矩阵。
每个框的输出格式都是字符矩阵(尽管其中大多数是空格),它是所有元素(内部矩形)的字符矩阵的水平连接。内部矩形与它们的基线对齐(稍后将解释)。连续元素之间没有空格,内部矩形和外部矩形的边界之间没有额外的空行或者空列。
每个元素也被格式化为字符矩形:
基本元素只占据一行,这被称作基线。我们使用三个字符 空格、减号、空格 来表示减号,所有其他元素的格式都是单个字符。
矩阵的格式如下:首先,格式化矩阵的所有单元格,然后将它们排列成矩阵。同一行中的框根据基线对齐,同一列中的框水平对齐。连续行用空行分隔,连续列用空列分隔。最后,在每行基线的两侧添加一对方括号。如果有奇数行,整个矩阵的基线就是中心行的基线。否则,整个矩阵的基线就是中心空线。
分数的格式如下:首先,格式化分母和分子,然后在这两个框之间画一条水平线(由 - 组成),这也是整个分数的基线。线条的宽度是两个宽度加上2的较大值(即两边多出一个 -)。分母和分子水平对齐。
请注意,在水平对齐矩形时,我们会固定最宽矩形的位置,并尝试移动其他矩形,以便它们的中心列与最宽矩形重合。如果对不齐(宽度奇偶性不同的矩形),可以将这些向左移动 0.5 个单位,比如这样:
XXXX
------
XXX
但是有一种特殊情况:如果表达式为空,则字符矩形是一个空行,即其宽度为零,但高度为一。当然,这个行行就是底线。
正确的样例输出为:
Case 1:
[1]
1
- 5---*[1 2 3]*[2]
6
[3]
Case 2:
1
1+-----------
1
1+-------
1
1+---
x
Case 3:
a
---
Case 4:
a
[--------]
[ e ]
b
c
[---]
d