所以我正在编写一个程序,该程序读取文件,然后再次输出它,但我在让程序停止在文件末尾输入时遇到了麻烦。我希望它停止在一个特定的字符,如'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
表示移动到一个单元格,用作临时变量。这个特定的代码确实要求temp0
和temp1
在内存中连续地跟随x
。
temp0[-]+
temp1[-]
x[
code1
x>-]>
[<
code2
x>->]<<