在Brainfuck中高效实现while循环

7

我在实现一个brainfuck汇编器时遇到了困难。我设法将字符串加载到内存中,找到它的长度,输出它,并以n次重复打印字符串等,但我似乎无法仅将小写数字加载到内存中。因此,让我们来看一下执行某些巫术的以下循环。(井号是调试标记。)

#,#[>#<[<]<<#+#>>>[>]#,#]<[<] 

从指针512开始,将字符串作为ASCII值写入512之后的位置。


现在,如果(出于任何原因)我希望剥离小写字符,则在伪BF中将如下所示。

#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)}
while(input>=96/*Go arbitrarily to the right for this implementation but
make sure that the first non-lowercase number is stored at the index*/)#
//Also be sure to zero out any temporary cells used
<[<] 

现在我的问题是,如何在仅使用512右侧的空间作为存储并稍后清除它们的情况下实现这样的while循环。对于那些好奇的人,这是我想在brainfuck中解决的问题
1个回答

2
您的代码可以简化为:
,[[<]<+>>[>],]<[<]

(<<+>> 可能是使用在线编译器时遗忘了单元格 255 的结果)

并且重复该操作,以执行输出操作:

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

如果您只想使用空单元格,那么可以这样做。但是,您需要制定自己的协议来定义下一个单元格,例如将每个数据单元格保存为带有下一个单元格距离的后续单元格,如下所示:
[..., 104, 5, x, x, x, x, 108, 3, x, x, 102, 2...] 

[...,  104 ,    5   , x, x, x, x,  108 ,    3    , x, x,  102 ,    2   ...] 
      data   pointer              data   pointer         data   pointer

x是任意非零值时(否则您将使用它),这个实现将类似于一个链表,但请注意,它将会占用大量的空间和代码。
清零单元格,或者您称之为“清洗”,可以通过使用[-]来完成,就像您使用[<]一样。这将减少单元格的值,直到它达到0,然后将循环退出。当您在字符串的末尾时,可以向下迭代该字符串,并在清除每个单元格时返回,直到到达开头(0或其他您放置的保留数字)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接