1

磁带大小最好比brainfuck的程序大小长吗?还是反过来更好?

另外,相对于彼此有多大?

我正在尝试为 Arduino 做一个笨拙的解释器。我知道这已经完成了,但我正在添加诸如Adafruit 显示和代码编写能力之类的东西。

因此,代码很长,特别是因为我将代码和磁带都存储在数组中:

char code[] = {};
byte tape[] = {};

内存应该至少包含 30000 个单元,一些现有的 Brainfuck 程序确实需要更多,所以这应该是可配置的或无界的。

我知道我永远不会将 30000 个单元格放入 Uno,但似乎动态内存是从中获得最大空间的方法。任何这样做的方式都值得赞赏。

目前,char code[512] = {};byte tape[1024] = {};使用“1,807 字节(88%)的动态内存”,但这只是解释器草图。我还需要在其中压缩更多代码。代码在这里,任何有兴趣的人都可以使用。

4

1 回答 1

1

您可以使用map对象来实现它,而不是创建有限的数组。使用索引作为,将该单元格中的值作为(如果它等于 0,则将其删除,如果该单元格的值现在上升到 1 或更多,或者下降到小于零,则在映射中创建一个新条目.

这样,您只存储不为 0 的值(节省内存和分配注意事项),并且您拥有理论上无限的磁带(更纯粹的实现)。

operation    map
----------------------------
#code_start  <>
+            <0 : 1>
+            <0 : 2>
-            <0 : 1>
-            <>
-            <0 : -1>
>+           <0 : -1, 1 : 1>
<<-          <-1 : -1, 0 : -1, 1 : 1>

可以通过包含#include <map>和创建std::map<int, int> map_name或您想要使用的任何类型来使用地图。

请参阅此处的文档:http ://www.cplusplus.com/reference/map/map/

于 2016-09-01T08:58:44.990 回答