在brainfuck中的Divmod算法

时间:2015-01-12 15:51:10

标签: algorithm division modulo brainfuck divmod

有人可以向我解释一下这段代码吗?我理解它的作用,但我不明白它是如何工作的。

# >n 0 d
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
# >0 n d-n%d n%d n/d

1 个答案:

答案 0 :(得分:4)

以下是发生的事情:

# >n 0 d

这一行是一条注释行,告诉你在操作之前应该是什么样的内存。红利为n,除数为d。根据代码,接下来的3个单元格也应该是空的,但是在这里忽略它,假设你默认为空。

为了便于理解,我现在以25/4为例:

ptr 000 001 002 003 004 005 006
val 025 000 004 000 000 000 000

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

这条线可以分成几部分以便于观察,但如果您只是使用它,它就是一个神奇的循环:

[->+>-

这一部分缩短了红利,将其添加回下一个细胞以进行保存,并减少除数。现在的记忆是:

ptr 000 001 002 003 004 005 006
val 024 001 003 000 000 000 000

[>+>>]

这将从被除数中删除一个,以便再次保留,因为我们需要它循环回来。

ptr 000 001 002 003 004 005 006
val 024 001 003 001 000 000 000

然后,它向右移动2个步骤到单元格005,然后向006移动,因为它们之间有>,因为单元格为空,所以跳过[+[-<+>]>+>>],然后返回由于这一行,为了000的单元格:

<<<<<<

额外的移动很重要,因为为了让系统不再循环,我们需要移动到一个空的空间。移动到006基本上是因为额外的>,这是以后使用所必需的。

让我们跳过一些步骤,继续前进,直到除数变为0。

ptr 000 001 002 003 004 005 006
val 021 004 000 003 000 000 000

它跳过[>+>>],因为单元格2现在为空,然后它移动到单元格003

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

由于003有一个值,因此必须运行此行。在值中添加一个以使其成为完整循环,然后使用002将值移回[-<+>]。指针在003处结束,因此它移动到004并将值加1以指示完整周期,因此指示商。它移至006并返回000

重复整个事情,然后我们得到:

ptr 000 001 002 003 004 005 006
val 000 025 003 001 006 000 000

就像最后一行

# >0 n d-n%d n%d n/d

as循环终止,因为000现在为空。 n现在完全转移到001002003显示n完全归零时除数的循环过程。 004显示除数循环的完整迭代次数。