文本编辑器

先介绍一下光标(上图中最左边的是编辑器显示的行号,用来展示用,并不是文本真正的内容,请忽略):
1.该编辑器里的光标是类似vi编辑器里命令模式那样,停留在一个字符上方,而不是字符与字符之间。
2.编辑器文本为空的时候(初始时,或者把内容全部删除以后),会显示一个空行,光标停留在那行行首(如图1)。此时执行o命令的话,在下方插入一行(如图2)。

再介绍一下撤销(undo)和重做(redo)命令:
1.编辑器的undo和redo操作跟vi编辑器的一样,是一个基于栈式的撤销功能。每当玩家输入一个命令的时候,如果可撤销的话(见第二条),就该操作压进Undo栈里,栈的大小为无限大,允许撤销全部的操作。
2.只有真正改变编辑器内文本的命令才会进入Undo栈,比如g命令,以及未对文本发生修改的d命令,还有undo、redo命令本身都是不可撤销的,即不会进入Undo栈。
3.当执行undo命令的时候,如果Undo栈里有元素,则从栈顶弹出最后一个命令,撤销掉该命令,光标回到执行该命令前的位置,并且将命令压入Redo栈里。
4.当执行redo命令的时候,如果Redo栈里有元素,则从栈顶弹出最后一个被撤销的命令,重新执行该命令,光标回到执行该命令后的位置,并且将命令重新压入Undo栈里。
5.当执行undo或redo命令的时候,如果相应的栈里没有元素,则不进行任何操作,忽略该命令。
6.当执行任何输入的命令的时候,都会清空Redo栈,即用undo撤销一个命令C的时候,再执行输入的其他命令以后,则不能再用redo功能重做上一次撤销的命令C。
完整的命令列表为:
g x y: 移动光标命令,将光标移动到第x行,第y列上方。当x超过总行数时,则为最后一行。当y超过该行列数的时候,则为最后一列。
i str:在光标所在字符前插入str这句话,光标最终会停留在这句话的最后一个字符上。注意,str必定不为空,但是里面可能包含空格。
a str:在光标所在字符后插入str这句话,其他同上。
o str:在光标所在行的下面另起一新行插入str这句话,其他同上。
dd:删除光标所在行,光标最终会停留在下一行的首字符上。如果删除的是最后一行,则停留在最后一行的首字符上。
d n:从光标所在位置开始,往右删除n个字符(输入保证n>0),最多只会删除到行尾,不会跨过当前行。光标最终停留在删除以后的下一个字符位置上。
undo:撤销上一个对文本发生改动的命令,光标也回到上一个命令执行前所在的位置。如果没命令可以撤销,则什么都不做。
redo:重新执行上一个撤销的命令,光标也回到上一个命令执行后所在的位置。如果没有已经撤销的命令,则什么都不做。注意,如果undo了一个命令,再执行新的命令,则也不能redo。
其中命令名字与参数、参数与参数中间都是用一个空格分割
下图为测试用例例子里的的编辑器里的展示

输入的每一行为一个命令,请处理到输入结束,输入最多不超过1000行,且每行均为合法的命令
输入保证每一行输入的最大字符数不超过1000个字符,且只包含英文、数字和空格输入样例: i abcdef o abcd g 1 10 a abcdef d 4 undo redo dd dd dd a hello world 输出描述: 请输出编辑器打开以后(初始状态),执行完输入命令以后,最后显示的文本输出样例 hello world