如果在Brainfuck中x == y,请计算

时间:2016-12-12 18:21:33

标签: 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 .

现在上面的问题是,计数器对抗每一个角色,而不仅仅是&#39;!&#39;。我的问题是,如何在Brainfuck中指定?

1 个答案:

答案 0 :(得分:1)

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