我想将一个包含 n 个元素的数组设置为预定义值(这不是从单元格复制,而是从代码本身设置值)。我怎么能这么做呢?没有像我之后经历的那样改变其他单元格?
最佳答案
我假设“数组”是指 Brainfuck 数组的连续部分;并且 n <256,因此您可以将 n 拟合到单元格中。在这种情况下,从内存“0 n ? ? ? ...”开始,指针指向 n,您可以执行以下操作:
[>[-]<-[>+<-] ++++++++++ or whatever >]
但是,根据您稍后将如何处理这些数据,将其间隔开更多通常是一个好主意;例如将其与 1 交错,您可以这样做
[>[-]>[-]<<-[>>+<<-] ++++++++++ or whatever >+>]
关于将数组的一大块复制到不同的位置,最好的办法是避免这样做,但如果您需要,这里有一个不错的方法。
[
->[>[>>]>+<<<[<<]>-]
>[>>]>>[>>]+[<<]>
[>[>>]<+<[<<]<<[<<]>+>[>>]>-]
<<<[<<]+>>
]
这假设当前内存布局是
0? 1a 1b 1c ... 1 z 0 0 0 ...
其中a、b、c等是任意数量的任意值,并且假设指针从最左边的1个单元格开始。这将是设置内存的合理方法。在 Brainfuck 中,选择你的内存布局以使事情变得简单是至关重要的。然后,此代码将这 block 内存复制到右侧的空间中,产生
0? 1 a 1 b 1 c ... 1 z 0 _ 1 a 1 b 1 c ... 1 z 0 ?
其中“_”单元格也是 0。此代码假定数据复制到的右侧空间已经清除。在 Brainfuck 中,您不想在使用空间之前清除空间,而是希望在使用完数据后清除数据。您需要清楚地了解执行过程中任何给定点的内容,并且不要让内存中塞满您忘记的内容。
对于每个值,此代码将其复制到数组之间的“_”空格,然后将 1 标记添加到不断增长的右侧数组,然后将该值移回其开始位置,并移至第二个数组中的位置,然后继续到下一个值。在循环期间,它会将要复制的值左侧的 1 个单元格设置为 0 作为标记,然后在结束时将其重置为 1。此代码在“_”单元格左侧的 0 单元格处结束。
请注意,如果您随后想要将所有左侧“数组”设置为 10,您可以这样做
<<[>[-]++++++++++<<<]
关于brainfuck - 如何在brainfuck中将大小为n的数组设置为特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70874024/