2

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

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

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

4

1 回答 1

3

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

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

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

现在假设我想分解循环体,当前每次迭代都添加 24。你做同样的过程。找出 24 的因数:对于这个例子,让我们选择 6 和 4。因此,在内部循环中,您放入第二个循环(它使用第二个临时单元来保存内部循环的迭代计数),循环 4 次,每次加 6。每次运行此内部循环时,目标单元格最终都会添加 24,并且内部循环运行两次(外部循环循环两次),因此目标单元格以 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) 并且生成的代码可能仍然更短。

于 2015-12-05T16:44:30.673 回答