在Brainfuck中创建if(x==y)语句



所以我正在编写一个程序,该程序读取文件,然后再次输出它,但我在让程序停止在文件末尾输入时遇到了麻烦。我希望它停止在一个特定的字符,如'0'或'$'或任何东西,因为一个字符NULL不能读到我的大脑解释器。下面是到目前为止的代码:

>+[>,][<.]

问题从[>,]开始,因为输入永远不可能为NULL,这个循环永远不会结束。

那么我如何插入if语句,如果它达到预先指定的结束字符,它将终止这个循环?

下面的代码与您的代码等效,除了当输入的值为1(在ASCII中不可打印)时它将停止。循环之间的<是必需的,因为最后一个值是0。

>+[+>,-]<[<.]

它在输入后减少值,检查它是否为0,如果不是,则循环。如果进行回循环,则必须再次增加指针以撤销减量。一个示例数组可以是:

00  02  H  e  l  l  o  _  W  o  r  l  d  00
                                          ^

然而,[<.]打印字符串的反面(后面跟着一个不可打印的1)。字符串本身可以通过将指针移动到开头并从那里向前移动来打印,如下面的代码所示:

>+[+>,-]<[<]>>[.>]

在此代码中,[<]在到达索引0时停止,>>移动到索引2(字符串开始),[.>]输出字符直到到达末尾的0。

如果您想使用不同的ASCII字符,例如空格(32),请在第一个循环中重复+-多次。(警告:如果输入中有任何小于32的字符,此代码将导致值低于0)。

>+[++++++++++++++++++++++++++++++++>,--------------------------------]<[<]>>[.>]

从有效字符开始-让我们从$开始,因为它是ASCII 36:

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

读取输入,将输入和有效字符复制两次,并将第二个有效字符放在末尾:

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

对于如下结构:

<>以前┌───┲━━━━━━━┱───────┬───────┬───┐│$│blank input│输入│$│└───┺━━━━━━━┹───────┴───────┴───┘之前

从第一个input中减去第一个$:

<[->>-<<]>>

如果它不为零,向前移动三次到$拷贝后的空单元格,然后无条件向后移动,当输入为$时退出循环,否则在$处留下您,准备重新开始:

[>>>]<]

循环结束后,您将留在匹配字符的blank上。向前移动到匹配的输入字符并擦除它,这样它就不会被重印,向后移动五次以到达倒数第二个input的完整副本,并从那里继续备份(这不必依赖于包装解释器,如果你在开始时向前移动一点):

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

然后打印出来!

>>>>>[.>>>>>]

,

++++++[->++++++<]>
[[->+>>>>+<<<<<]>>,[->+>+<<]<[->>-<<]>>[>>>]<]
>>[-]<<<<<[<<<<<]>>>>>[.>>>>>]

这是一个很有帮助的页面,里面充满了我喜欢使用的BF算法。

你需要的算法是#19 (x = x==y)和#28 (if (x) {code})或#30 (if (x) {code1} else {code2})。

检查两个单元格是否相等很容易,所以我在这里复制if (x) {code1} else {code2}算法。temp0表示移动到一个单元格,用作临时变量。这个特定的代码确实要求temp0temp1在内存中连续地跟随x

temp0[-]+
temp1[-]
x[
 code1
 x>-]>
[<
 code2
 x>->]<<

相关内容

  • 没有找到相关文章

最新更新