在 brainfuck 中将数字的倍数输入细胞的更好方法?

Better way to get multiples of a number into cells in brainfuck?

所以我试图让单元格保持这样第一个单元格为空 (0),第二个单元格为 9*4,第二个为 9*10,第三个为 9*12,第四个, 9*13,依此类推,直到最后一个使用的单元格为 9*15。也就是说,到目前为止,以下代码在 brainfuck:

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

有没有压缩这段代码的方法?也就是说,是否有适当的单元格保存有问题的数字但使用较少的字符来做到这一点?我想过使用嵌套循环,但我不确定如何构造这样的东西。我是这门语言的新手,我正在尝试对其进行测试,但我认为我对这个问题的思考太多了。

要使用内部循环找出要放入单元格中的数字的因数。

假设您要将单元格设置为 48

你可以让外循环循环两次。到目前为止一切顺利,您使用一个临时单元格来保存循环值,并在内部将目标单元格增加 24,这样您最终得到 48。

现在假设我想分解循环体,它目前在每次迭代时都加 24。你做同样的过程。找出 24 的因数:对于这个例子,让我们选择 6 和 4。所以在内部循环中,你放入第二个循环(它使用第二个临时单元格来保存内部循环的迭代计数),循环 4 次,每次加 6。每次这个内循环 运行s,目标单元格以 24 结束,内循环 运行s 两次(外循环循环两次)所以目标单元格以 48 结束。

这是仅使用 1 个临时单元格的示例

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

这使用单元格 0 作为计数器并通过将 24 相加两次将单元格 1 设置为 48。

这是具有 3 个因子的第二个示例:2、4、6 (2*4*6==48)

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

这使用单元格 0 和 1 作为临时单元格,并将目标单元格(单元格 2)也设置为 48。如您所见,内部循环 (++++[>++++++<-]) 的内容只是第一个示例中的普通循环。

很明显第二个更短,但它可能 运行 稍微慢一点(这并不是一个真正的问题......你首先使用的是 BF,你'我们不是在寻找性能)

既然您想一次设置多个单元格,那么将上面的内容应用到您的代码中就非常容易了。您以与我上面描述的相同的方式找出因子,并将所有因子共有的因子作为外循环的计数器,然后使用它们的剩余因子为其中的每个单元构建单独的内循环。如果任何内部因素也共享因素,您甚至可以合并其中一些。

另一个可以在数字不能完全整除时缩短代码的技巧是尽可能接近你想要的数字并在最后调整它。

使用我在上面使用的相同示例,如果我想将单元格设置为 49 而不是 48,我将使用将其设置为 48 的相同代码,然后在末尾添加 1(或设置它到 50 并减去 1),结果代码可能仍然更短。