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

标签 brainfuck

我想将一个包含 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/

相关文章:

c - 数据段前未初始化的可写数据

brainfuck - 如何使用 BrainFuck 计算 2 个数字的总和

c++ - 制作 JIT 编译器

comments - 如何在 Brainfuck 中写入包含句点 (.) 的 "comment"?

brainfuck - brainfuck 中的数字总和

algorithm - 在 brainfuck 程序中检测无限循环

binary - Brainfuck 与 1 位存储单元?

memory - 如何获取一个大整数作为输入并将其存储在内存中

while-loop - 在 Brainfuck 中将一个数字的倍数放入细胞中的更好方法?