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

标签 while-loop multiplication brainfuck esoteric-languages

所以我试图让单元格保持,使得第一个单元格保持空(0),第二个单元格保持 9*4,第二个单元格保持 9*10,第三个单元格保持 9*12,第四个单元格保持 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),生成的代码可能仍然更短。

关于while-loop - 在 Brainfuck 中将一个数字的倍数放入细胞中的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34101857/

相关文章:

java - Hangman Java 游戏打印错误和正确的猜测

java - 名称后菜单循环,Java

java - 10 × 10 乘法表,但仅显示大于用户输入值的条目

python - Numpy - 查找自定义 A nxn 矩阵和 B nx1 的乘积 Ax=b

string - 在brainf*ck的270个字符中打印出178个字符的字符串

Python Brainf*** – while 循环中的错误

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

c++ if(cin>>input) 在 while 循环中不能正常工作

php - 使用 PHP 'while' 循环更改 div 的不透明度

java - 无法添加两个 JTabbedPane