3

例如,如果数组是这样的0 0 0 0 ... 0 0[n]s o m e d a t a 4 9 9 9 9 9 9 8 3 7 ...,如何将指针移动n,而s o m e d a t a 4 9 9 9 ...指针移动后不改变?

4

2 回答 2

7

不错的挑战。我喜欢这种语言:)

我的解决方案(我认为)有些正确,它将光标移动到长度为 n 的数据之后而不更改它,但是它将数据向左移动两个单元格(或一个,前提是满足某些条件)。下面是代码,希望对你有用。

要求是:

  • 数据左侧有一个空单元格,并且
  • 指针指向那个空单元格并且
  • 数据本身没有空单元格。

这是代码:

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

示例:一个数组7 9 6,所以3告诉光标移动多远。

0 3 7 9 6 ?   this line represents data; values are numbers in cells
^             this shows the pointer location

>[<->+]< gives

3 0 7 9 6 ?
^

now the loop; while the pointer is not zero
[

>>[-<+>] gives in first iteration
3 7 0 9 6 ?
    ^

<<[->>+<<] gives in first iteration
0 7 3 9 6 ?
^

>[-<+>] gives in first iteration
7 0 3 9 6 ?
  ^

>[-<+>] gives in first iteration
7 3 0 9 6 ?
    ^

<- decreases the loop pointer and gives in first iteration
7 2 0 9 6 ?
  ^

which means the loop can continue giving
7 2 9 0 6 ?
7 0 9 2 6 ?
7 9 0 2 6 ?
7 9 2 0 6 ?
7 9 1 0 6 ? after the second iteration and finally
    ^
7 9 6 0 0 ? after the last
      ^
] which is where the loop will end

现在,如果整个序列的左侧有一个额外的空单元格,那么我们可以将数据向右移动一个单元格。

0 7 9 6 0 0 ?
        ^

<[[>+<-]<] gives
0 0 7 9 6 0 ?
^

>>[>] gives finally
0 0 7 9 6 0 ?
          ^

所以光标移动到任意长度的数据后面,但是将数据向左移动一个单元格。

免责声明代码中可能存在错误,但想法本身应该很清楚。只要代码与示例不匹配,请随时更正代码。

于 2011-06-16T12:37:26.650 回答
1

这可能太明显了,但您可以使用[>]或将指针滑动到下一个零[<]。那么你可以在你的数据单元格中加 1(包装一个 peano)并在输出之前减去 1([-.>])吗?

可悲的是,这可能无法提供足够精细的控制。

于 2011-08-12T07:40:47.707 回答