brainfuck中while循环的高效实现

Efficient implementation of while loop in brainfuck

我在为 codegolf.se 实现 brainfuck 汇编程序时遇到了问题。我设法将一个字符串加载到内存中,找出它的长度,打印字符串 n 次等,但我似乎无法将非小写数字加载到内存中。因此,让我们采用以下执行一些魔法的循环。 (哈希标记是调试标记。)

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

它从指针 512 开始并将字符串作为 ascii 值写入 512 之后的位置


现在,如果(无论出于何种原因)我想去掉小写字符,它在 psuedo 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
<[<] 

现在我的问题是,如何实现这样一个 while 循环,同时仅使用 512 右侧的空格作为存储空间并稍后将其清除。

对于那些好奇的人,this是我想在branfuck解决的问题。

您的代码可以简化为

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

<<+>> 可能是使用在线编译器忘记了单元格 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 是任意值时,none- 零值(否则你会使用它)。此实现类似于链表,但请注意它将是 space 并且代码昂贵 .


归零单元格,或者如您所说的清理单元格,可以按照与 [<] 相同的方式完成 - 使用 [-]。这将减少单元格的值,直到它达到 0 - 然后循环。您可以在字符串结束时向下迭代字符串 - 然后在清理每个单元格时返回,直到您到达开头(0 或您放置在那里的其他保留数字)。