所以我正在开发一个程序,它读入一个文件,然后再将它输出,但是我无法让程序在文件末尾停止输入。我希望它停在特定的字符,如'0'或'$'或任何真正的因为一个字符NULL无法读入我的brainf解释器。这是迄今为止的代码:
>+[>,][<.]
问题从[>,]
开始,因为输入永远不会为NULL,这个循环永远不会结束。
那么如果它到达预先指定的结束字符,我怎么能插入一个if语句来终止这个循环呢?
答案 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
表示移动到单元格以用作临时变量。此特定代码确实要求temp0
和temp1
在内存中连续跟随x
。
temp0[-]+
temp1[-]
x[
code1
x>-]>
[<
code2
x>->]<<