2015-01-10 2 views
1

Я хотел бы знать, можно ли вычислить сумму 1 + 2 + 3 + ... + k в brainfuck только с номером k в начале кода?Сумма числа в brainfuck

Для примера можно сделать 1 + 2 + 3, как это:

+++> (здесь код создает два добавить его в три, создать и добавить его)

Потому что я может сделать это: +++>++>+[<<+>>-]<[<+>-]<, но если k = 10000, как я могу это сделать?

+0

Не 1 + 2 + ... + к = k * (k + 1)/2? –

+0

Да, это так. Я полагал, что он явно хотел сделать это таким образом. –

+0

@ IngoBürk Я не хочу делать k * (* + 1)/2 Я хочу сделать рекурсивную программу, такую ​​как «k = 10 a = 0, когда k> 0 a = a + kk = k-1 возвращает a" :) –

ответ

3

Простая версия. Предположим, что мы назвали первые три ячейки y, temp0 и x. Тогда мы можем просто использовать 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 

Обратите внимание, что это только работает до k = 22 из-за границы 8-битным. Чтобы вывести номер или иметь дело с большими номерами, вам придется использовать дополнительные усилия.

+0

@ IngoBürg Большое спасибо Я постараюсь понять это шаг за шагом: D На моем интерпретаторе у меня есть 32-битный предел, если я хочу :) –

+0

@ IngoBürg Хорошо Мне очень сложно понять, как вы сделали эту программу вы мне объясните, пожалуйста? –

+0

Что-нибудь в частности? Я в значительной степени описал это: получить число, перебрать его, применить алгоритм из ссылки, которую я опубликовал, и уменьшить счетчик в цикле. Однако я рад ответить на любые конкретные вопросы, которые у вас есть. –

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

Более сжатый и эффективный алгоритм, чем у Инго. Использует три «прорези»

  • | num |: оригинальный номер; уменьшал каждый цикл.
  • | temp |: скопировано обратно в | 1 | каждый цикл
  • | Общая |: накапливает значения от каждого цикла

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