在Brainfuck中制作if(x == y)语句

时间:2014-07-21 03:23:22

标签: if-statement brainfuck esoteric-languages

所以我正在开发一个程序,它读入一个文件,然后再将它输出,但是我无法让程序在文件末尾停止输入。我希望它停在特定的字符,如'0'或'$'或任何真正的因为一个字符NULL无法读入我的brainf解释器。这是迄今为止的代码:

>+[>,][<.]

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

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

3 个答案:

答案 0 :(得分:5)

以下代码等同于您的代码,但输入值为1(ASCII不可打印)时将停止。 &lt;因为最后一个值为0,所以需要重新使用循环。

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

它在输入后递减值,检查它是否为0,如果不是则循环回来。如果它循环回来,它必须再次递增指针以撤消减量。示例数组可能是:

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

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

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

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

如果要使用其他ASCII字符,例如space(32),请多次在第一个循环内重复+和 - 。 (警告:如果输入中有任何小于32的字符,此代码将导致值低于0。

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

答案 1 :(得分:2)

从你的重要角色开始 - 让我们去$,因为它是ASCII 36:

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

读取输入,将输入和重要字符复制两次,最后使用第二个重要字符:

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

对于这样的结构:

┌───┲━━━━━━━┱───────┬───────┬───┐
│ $ ┃ blank ┃ input │ input │ $ │
└───┺━━━━━━━┹───────┴───────┴───┘

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

<[->>-<<]>>

如果它不为零,则在$副本之后向前移动三次到空单元格,然后无条件地向后移动,当输入为$时退出循环,否则将离开{ {1}},准备重新开始:

$

循环结束后,您将离开匹配角色的[>>>]<] 。向前移动到匹配的输入字符并将其删除以便不重新打印,向后移动五次以达到倒数第二个blank的完整副本,并从那里继续备份(这不是我必须依赖包装口译员,如果你在开始时向前移动一点):

input

然后将它们打印出来!

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

总之,

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

答案 2 :(得分:0)

这是一个很有用的页面,我想使用BF algorithms

您需要的算法是#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>->]<<