7

我在为 codegolf.se 实现一个笨拙的汇编程序时遇到了麻烦。我设法将一个字符串加载到内存中,找到它的长度,打印字符串 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 循环。

对于那些好奇的人,是我希望在 branfuck 中解决的问题。

4

1 回答 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

whenx是一些任意的非零值(否则你会使用它)。这种实现将是一种链表,但请注意它会占用大量空间和代码


将细胞归零,或者你称之为清洁它们,可以像你做的一样完成[<]- 通过使用[-]. 这将减少单元格的值,直到它达到 0 - 然后将循环输出。您可以在字符串结束时向下迭代字符串 - 并在清理每个单元格时返回,直到您点击开头(0或您放在那里的其他保留数字)。

于 2016-09-12T13:02:46.777 回答