在brainfuck中的数字总和

时间:2015-01-10 04:27:12

标签: brainfuck

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

例如,可以像这样做1 + 2 + 3:

+++>(此处代码创建一个两个添加三个,创建一个并添加它)

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

2 个答案:

答案 0 :(得分:4)

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

+++           # 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

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

答案 1 :(得分:3)

,[[>+>+<<-]>-[<+>-]<]>>.

比Ingo更简洁高效的算法。使用三个&#34;插槽&#34;

  • | 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