所以我正在开发一个读取文件然后再次输出的程序,但是我无法让程序在文件末尾停止输入。我希望它停在一个特定的字符上,比如 '0' 或 '$' 或任何其他字符,因为我的 Brainf 解释器无法将一个字符 NULL 读入。这是到目前为止的代码:
>+[>,][<.]
问题开始于[>,]
输入永远不会是 NULL 这个循环永远不会结束。
那么如何插入一个 if 语句来终止这个循环,如果它到达一个预先指定的结束字符呢?
所以我正在开发一个读取文件然后再次输出的程序,但是我无法让程序在文件末尾停止输入。我希望它停在一个特定的字符上,比如 '0' 或 '$' 或任何其他字符,因为我的 Brainf 解释器无法将一个字符 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),请在第一个循环中重复+
and-
多次。(警告:如果您的输入中有任何小于 32 的字符,此代码将导致值低于 0)。
>+[++++++++++++++++++++++++++++++++>,--------------------------------]<[<]>>[.>]
从你的重要角色开始——让我们开始吧$
,因为它是 ASCII 36:
++++++[->++++++<]>
读取输入,将输入和有效字符复制两次,最后一个有效字符:
[[->+>>>>+<<<<<]>>,[->+>+<<]
对于这样的结构:
┌───┲━━━━━━┱────────┬───────┬───┐ │ $ ┃空白┃ 输入 │ 输入 │ $ │ └───┺━━━━━━┹────────┴───────┴───┘</pre>
$
从第一个减去第一个input
:<[->>-<<]>>
如果它不为零,则在 的副本之后向前移动 3 次到空单元格
$
,然后无条件地向后移动,当输入为时退出循环$
,否则将您留在 a 处$
,准备重新开始:[>>>]<]
循环之后,您将留在
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>->]<<