8

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

>+[>,][<.]

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

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

4

3 回答 3

7

以下代码等效于您的代码,除了它会在输入值为 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)。

>+[++++++++++++++++++++++++++++++++>,--------------------------------]<[<]>>[.>]
于 2014-07-21T03:53:38.367 回答
3

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

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

读取输入,将输入和有效字符复制两次,最后一个有效字符:

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

对于这样的结构:

┌───┲━━━━━━┱────────┬───────┬───┐
│ $ ┃空白┃ 输入 │ 输入 │ $ │
└───┺━━━━━━┹────────┴───────┴───┘</pre>

$从第一个减去第一个input

<[->>-<<]>>

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

[>>>]<]

循环之后,您将留在blank匹配字符的位置。向前移动到匹配的输入字符并将其擦除,这样它就不会被重新打印,向后移动五次以到达倒数第二个input的完整副本,并从那里继续备份(这不必依赖于换行口译员等,如果你在开始时向前移动一点):

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

然后打印出来!

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

在所有,

++++++[->++++++<]>
[[->+>>>>+<<<<<]>>,[->+>+<<]<[->>-<<]>>[>>>]<]
>>[-]<<<<<[<<<<<]>>>>>[.>>>>>]
于 2014-07-21T04:12:59.420 回答
0

这是一个有用的页面,里面有我喜欢使用的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>->]<<
于 2016-02-26T17:47:15.553 回答