在 Brainfuck 中计算 x ==y

Count if x ==y in Brainfuck

我正在尝试在 brainfuck 中构建一个计数器来计算“!”的出现次数在任何给定的输入中,如果 '!'出现3次'OK'应该打印出来,否则什么都不打印。 这是我的代码:

+++ //0:'3'
[>++++++++++ ++++++++++ ++++++++++ +++  // a loop which compare each char in the given text with the '33*+'which means '!' saved in cell 1:'33'
 >,<
[->-<] <-] //and reducing the 3 in cell 0 -1
>>>++++++++++ ++++++++++ ++++++++++  // char 'o' in 2
  ++++++++++ ++++++++++ ++++++++++ 
  ++++++++++ ++++++++++ ++++++++++
  ++++++++++ ++++++++++ +
>  ++++++++++ +++++++++ ++++++++++ // char 'k' in 3
  ++++++++++ +++++++++ ++++++++++
  ++++++++++ +++++++++ ++++++++++
  ++++++++++ +++++++
<<<[->]>>.>.  // if false ok won't be printed .

现在上面的问题是计数器计数器每个字符,而不仅仅是 '!'。我的问题是,如何在 Brainfuck 中指定它?

BF 中只有一个比较运算符。将某物与 0 进行比较(分别使用 [] 命令)。

因此,要比较相等性,您需要将一个数字从另一个数字中减去,并检查结果是否为 0。如果您正在使用允许换行的 brainfuck 实现(从 0 中减去 1 得到最大值)那么这真的很容易,因为你像这样从一个数字中减去另一个数字(假设值在单元格 0 和 1 中):

>[<->-]<

这以单元格 0 中的结果结束,单元格 0 和单元格 1 的指针设置为 0。

从那里开始,检查值是否为 0 很简单。指针仍位于单元格 0(减法结果所在的位置),您可以执行以下操作:

[ if the current value is not 0 
     your code goes here
     return back to cell 0
     [-] clear cell 0 so the "loop" exits after only one iteration
] exit the loop after only one iteration (if cell 0 was originally nonzero) and leave cell 0 with the value 0 inside

如果您的 brainfuck 实现不支持换行,则您需要一次执行此步骤。从每个数字中减去一个,并在每一步检查它们中的任何一个是否为零(记住复制周围的值,这样它们就不会被破坏,您仍然可以执行下一次迭代)。一旦其中一个值为零,就终止循环。如果值相等,此时两个值都应为零。我将把这个算法的实现作为练习留给你:)