2

我想知道是否可以仅用代码开头的数字 k 来计算 Brainfuck 中 1+2+3+...+k 的总和?

例如,是否可以像这样执行 1+2+3:

+++>(这里的代码创建一个两个加上三个,创建一个并添加它)

因为我可以这样做:+++>++>+[<<+>>-]<[<+>-]<但是如果 k=10000 我该怎么做呢?

4

2 回答 2

4

这是一个简单的版本。假设我们将前三个单元格命名ytemp0x。然后我们可以简单地在递减循环中使用这个算法:

+++           # Input number (in fisrt cell)
[             # loop while first cell is not 0
 >[-]         # if second cell is null
 <[>>+<+<-]   # copy first cell in second and third and decrease it to 0
 >[<+>-]      # move second cell in first cell
 <-           # decrement input
]             # go to begin of while loop
>>            # the current cell now has the result

请注意,这仅适用k = 22于 8 位限制。要输出数字或处理更大的数字,您必须付出额外的努力。

于 2015-01-11T00:00:18.320 回答
3
,[[>+>+<<-]>-[<+>-]<]>>.

比 Ingo 更简洁有效的算法。使用三个“插槽”

  • |num|: 原始编号;减少每个循环。
  • |temp|: 复制回 |1| 每个循环
  • |total|: 每次循环累加值

    +++          input |num|
    [            while |num| is non-zero
      [>+>+<<-]    copy |num| to |temp| and |results|
      >-[<+>-]     copy |temp-1| back to |num|
      <            reset pointer
    ]
    >>.          output |total|
    
  • 相同的解释,但更详细

    +++          input |num|
    [            while |num| is non-zero
    
      [             until |num| is zero
        >+>+          increment |temp| and |total|
        <<            return to |num|
        -             decrement |num|
      ]
      >-           goto |temp|, decrement
      [<+>-]       until |temp| is zero; decrement |temp|; increment |num|
    
      <           goto |num|
    ]
    >>.          goto |total|, output it
    
于 2015-02-14T22:41:37.903 回答