跳转至内容

1L_a/扁平化 1L_a 编程

来自维基教科书,自由的教科书

创建 1L_a 程序的一种方法是先编写相应的 Brainf*** 程序,然后将其转换为 1L_a。因此,是时候引入一种新的语言,扁平化 1L_a,它介于 1L_a 和 Brainf*** 之间。

Brainf*** 及其最小化版本

[编辑 | 编辑源代码]

如你所知,Brainf*** 是一种众所周知的、一维的编程语言。与 1L_a 一样,它也有 DP 和 IP,但 DP 只能在一行上移动,并且 DP 在字符数组上移动,而不是位数组上移动。它是图灵完备的,并且有 8 个指令。以下是这些指令

指令 操作
> 将 DP 向右移动
< 将 DP 向左移动
+ 增加 DP 指向的内存单元的值
- 减少 DP 指向的内存单元的值
. 输出 DP 指向的字符
, 输入一个字符并将其存储在 DP 所在的单元格中
[ 如果 DP 所在的单元格为 0,则跳过匹配的 ]
] 如果 DP 所在的单元格为 0,则跳回匹配的 [

然而,作为图灵陷阱(只包含少数指令且图灵完备的语言),8 个指令有点太多了。因此,我们可以创建具有更少指令的 Brainf*** 等效语言。

如果可以在 Brainf*** 中实现该语言中的每个指令,并且可以在该语言中实现 Brainf*** 中的每个指令,那么我们称该语言为 Brainf*** 等效语言。

很明显,我们可以通过对位数组(如 1L_a!)而不是字符数组进行操作,将 Brainf*** 减少到 7 个指令,这样 + 和 - 指令就变成一个指令:切换操作,表示为 @。可以使用强大的流程控制来模拟字符数组,但这会很笨拙,我太懒了,不想这样做。幸运的是,已经有人替我们做好了这件事。

Brainf*** The new language
--------- ----------------
>         >>>>>>>>>
<         <<<<<<<<<
+         >>>>>>>>[<]@>[@>]<<<<<<<<<[@]
-         @>>>>>>>>@[<@]>[>]<<<<<<<<<[@]
[         @[>>>>>>>>@[<@]>[>]<<<<<<<<<[@]>>>>>>>>[<]@>[@>]<<<<<<<<<@[@
]         >>>>>>>>>@<<<<<<<<<]>>>>>>>>>[<<<<<<<<<@>>>>>>>>>@]<<<<<<<<<]
.         >.<
,         >,<

我们称这种语言为 Boolf***。由于 Brainf*** 是图灵完备的,并且可以将任何 Brainf*** 程序转换为 Boolf*** 程序,因此 Boolf*** 也是图灵完备的。

华夏公益教科书