更好的方法是将一个数字的倍数加入到brainfuck的细胞中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更好的方法是将一个数字的倍数加入到brainfuck的细胞中?相关的知识,希望对你有一定的参考价值。

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

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

反正有没有压缩这段代码?也就是说,让正确的单元格保存有问题的数字,但使用较少的字符来执行此操作?我想过使用嵌套循环,但我不确定如何构建这样的东西。我是这门语言的新手,我正试图对它进行测试,我认为我正在思考这个问题。

答案

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

假设您要将单元格设置为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)并且结果代码可能仍然更短。

以上是关于更好的方法是将一个数字的倍数加入到brainfuck的细胞中?的主要内容,如果未能解决你的问题,请参考以下文章

显示范围内给定数字的倍数

写一个程序输出1到100这些数字。但是遇到数字为3的倍数的时候,输出“三”替代数字,为5的倍数用“五”代替,既是3的倍数又是5的倍数则输出“三五”。

golang 编写一个程序,打印从1到N的数字。但是对于三个打印的“Fizz”而不是数字,以及ff的倍数的倍数

删除内核调用中的倍数以获得更好的性能

在两个极限之间找到 3 和 5 的所有倍数 - 复杂性

codeforces 792CDivide by Three(两种方法:模拟动态规划