代码长度或磁带大小:brainf ...(munged)
Code length or tape size: brainf... (munged)
用 brainfuck 最好让磁带大小比程序大小长吗?还是反过来更好?
还有,相互之间有多大关系?
我正在尝试为 Arduino 制作一个 brainfuck 解释器。我知道以前有人这样做过,但我正在添加诸如 Adafruit Display 和代码编写能力之类的东西。
因此,代码很长,特别是因为我将代码和磁带都存储在数组中:
char code[] = {};
byte tape[] = {};
Memory should consist of at least 30000 cells, some existing brainfuck programs do need more so this should be configurable or unbounded.
我知道我永远不会将 30000 个单元装入一个 Uno,但动态内存似乎是充分利用它的方法 space。任何方式都表示赞赏。
目前,char code[512] = {};
和 byte tape[1024] = {};
使用“1,807 字节 (88%) 的动态内存”,但这只是解释器草图。我还需要在其中压缩更多代码。代码是 here 给任何有兴趣的人。
您可以使用 map
对象来实现它,而不是创建有限的数组。将索引用作 keys,将该单元格中的值用作 value(如果等于零则删除它,并在如果该单元格的值现在上升到 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
或您想要使用的任何类型创建。
用 brainfuck 最好让磁带大小比程序大小长吗?还是反过来更好?
还有,相互之间有多大关系?
我正在尝试为 Arduino 制作一个 brainfuck 解释器。我知道以前有人这样做过,但我正在添加诸如 Adafruit Display 和代码编写能力之类的东西。
因此,代码很长,特别是因为我将代码和磁带都存储在数组中:
char code[] = {};
byte tape[] = {};
Memory should consist of at least 30000 cells, some existing brainfuck programs do need more so this should be configurable or unbounded.
我知道我永远不会将 30000 个单元装入一个 Uno,但动态内存似乎是充分利用它的方法 space。任何方式都表示赞赏。
目前,char code[512] = {};
和 byte tape[1024] = {};
使用“1,807 字节 (88%) 的动态内存”,但这只是解释器草图。我还需要在其中压缩更多代码。代码是 here 给任何有兴趣的人。
您可以使用 map
对象来实现它,而不是创建有限的数组。将索引用作 keys,将该单元格中的值用作 value(如果等于零则删除它,并在如果该单元格的值现在上升到 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
或您想要使用的任何类型创建。