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
或您放置在那里的其他保留数字)。
我在为 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
或您放置在那里的其他保留数字)。