我使用Notepad++及其查找/替换正则表达式引擎创建了一个运行正常的图灵机。看看busybeaver。Notepad++中的txt或(几乎)任何其他带有regex find/replace选项的文本编辑器。
机器由磁带、读/写磁头、当前指令和指令集组成。
这盘磁带是以a开头的一行!后跟一个0和1的字符串。
读/写头是一行,以[开头,后跟预设的空白量,以^结尾。
当前指令是一行,以#开头,后跟当前指令的名称。
指令集是剩余的行,格式为>;C.I:WMN I当前磁带位置的输入。0或1。每条指令都有两个输入的执行参数。
W在当前位置写入磁带的输出。0或1。
M读/写磁头的运动。0将头部向左移动一个位置。A 1将其向右移动。
N在新磁带位置执行的下一条指令的名称。
该机器当前处于指令指令指令中,当前磁带位置包含1。
INST.1定义了以下指令:写入0,向右移动头部,转到INST指令。
在用0覆盖磁带并将磁头向右移动后,新的磁带位置将包含0,我们仍将使用指令指令INST。
INST.0定义了以下指令:写入0,向左移动磁头,转到指令暂停。
因为此时磁带已经包含0,所以磁带的内容不会更改。将头部向左移动后,我们进入指令暂停。由于没有使用此名称定义指令集,因此机器将停止运行。
一旦正则表达式不再找到匹配项,并且replace停止工作,机器就会停止运行。
提示:为了节省一些点击时间,您可以单击“替换”一次,然后按住键盘上的Enter键以快速执行许多指令。
正则表达式匹配磁带、读/写磁头和当前指令。在每次指令迭代中,所有这些内容都会被find/replace框的内容替换。
正则表达式中括号内的所有内容都称为组。第四组括号可以稍后在表达式中用\4引用。在这种情况下,\ 4是当前指令集的名称,\ 2是当前磁带位置的值。向前看会经过每一行文本,直到找到以>\4\.\2:然后它可以对其进行解析,以获取执行当前指令所需的信息。
\3磁带的其余部分、换行、所有读/写磁头行、换行、#
\8为了移动磁头,需要修改磁带的开头(解释如下)
这些组用于拼凑查找/替换的替换部分。大部分信息保持不变,但一些关键元素会根据前瞻在当前指令中找到的内容进行修改。
要向左或向右移动磁头,请在磁带开头插入0,或从磁带开头删除0。当读/写磁头保持静止时,它会向左或向右滚动磁带。在当前的实现中,只要我们想读取当前位置,读/写磁头就会查看磁带的第22个元素。对于使用长磁带的复杂机器,您需要增加这个数字,这样在滚动时就不会删除必要的磁带元素。这可以通过增加表达式开头的{20}来实现。要使所有内容都正确显示,请确保增加磁带的长度,并将表示读/写磁头的“^”移动到下一行。
这实质上是在指令中表示移动的位置上匹配(0或1)。但按照分组与|运算符结合使用的方式,这将导致以下结果:
如果移动指令为1,则\8将包含空字符串,因为|右侧没有第8组。
我们利用这一点,将磁带的第一个元素(必须是0)替换为\8\8。如果我们考虑以下磁带:
0(左)的移动指令将用00替换磁带上的第一个0:
移动指令1(右)将用两个空字符串替换磁带上的第一个0:
替换两个0或两个空字符串会导致功能区在读/写磁头上方向左或向右滚动。