如何在 brainfuck 中将大小为 n 的数组设置为特定数字

how to set an array with the size of n to a specific number in brainfuck

我想将 n 个元素的数组设置为预定义值(这不是从单元格复制而是从代码本身设置值)。我怎么能那样做?之后我没有更改其他单元格?

我假设“数组”是指 brainfuck 数组的连续部分;并且 n <256 所以你可以指望在单元格中安装 n。在这种情况下,从内存“0 n ? ? ? ...”和指针 n 开始,您可以执行以下操作:

[>[-]<-[>+<-] ++++++++++ or whatever >]

但是,根据您以后要如何处理这些数据,最好 space 多出一些数据;例如将它与 1s 交错你可以做

[>[-]>[-]<<-[>>+<<-] ++++++++++ or whatever >+>]

关于将数组的一块复制到不同的地方,最好的办法是避免需要这样做,但如果需要,这里有一个不错的方法。

[
  ->[>[>>]>+<<<[<<]>-]
  >[>>]>>[>>]+[<<]>
  [>[>>]<+<[<<]<<[<<]>+>[>>]>-]
  <<<[<<]+>>
]

这里假设当前内存布局是

0 ? 1 a 1 b 1 c ... 1 z 0 0 0 ...

其中a、b、c等是任意数量的任意值,它假定指针从最左边的1个单元格开始。这是设置内存的合理方式。在 brainfuck 中,选择你的内存布局以使事情变得简单是至关重要的。然后这段代码将这块内存复制到右边的 space 中,产生

0 ? 1 a 1 b 1 c ... 1 z 0 _ 1 a 1 b 1 c ... 1 z 0 ?

其中 '_' 单元格也是 0。此代码假定右边的 space,数据正在复制到其中,已经很清楚了。在 brainfuck 中,您不想在使用之前清除 space,而是想在用完之后清除数据。在执行过程中的任何给定点,您都需要清楚地知道什么是什么,而不是让内存被您忘记的东西弄得乱七八糟。

对于每个值,此代码将其复制到数组之间的“_”space,然后将 1 标记添加到不断增长的右侧数组,然后将值移回其开始位置,并移入它在第二个数组中的位置,然后继续下一个值。在循环期间,它将其复制值左侧的 1 个单元格设置为 0 作为标记,然后在结束时将其重置为 1。此代码在“_”单元格左侧的 0 单元格处结束。

请注意,如果您随后想将所有左侧“数组”设置为 10,您可以这样做

<<[>[-]++++++++++<<<]