2016-12-07 3 views
0

Я попытался написать программу brainfuck, которая запрашивает у пользователя два числа (меньше 10) для вычисления произведения этих чисел. После вычисления он должен распечатать результат. Мой код выглядит следующим образом:Умножение в Brainf * ck

++++[>++++[>+++<-]<-] writing 48/0x30/'0' in cell(2) 
    ,>,>     reading two numbers in cell(0) and cell(1) 
    [<-<->>-]    decrementing cell(0) and cell(1) by 48/0x30/'0' 
    <<      go to cell(0) 
    [      muliplication loop 
     >     go to cell(1) 
     [>+>+<<-]   move cell(1) to cell(2) and cell(3) 
     >>     go to cell(3) 
     [<<+>>-]   move cell(3) back to cell(1) 
     <<<-    decrement cell(0) 
    ] 
    ++++[>++++[>+++<-]<-] adding 48/0x30/'0' to cell(2) 
    >>.      print result 

Это дает мне очень странные результаты:

0 * 1 = 3 
1 * 1 = 4 
1 * 2 = 8 
2 * 1 = 5 
2 * 2 = : 

и так далее.

Конечно, выход на самом деле выглядит следующим образом:

1 
1 
4 

, но я хотел показать его более удобным для чтения здесь.

ответ

0

После некоторого рассмотрения, я понял, что сделал огромную ошибку, когда изменяю результат на печатный номер. Я использую ячейку (1) как временную ячейку счетчика, хотя она все еще имеет значение в ней. Таким образом, я вставил >[-]< перед добавлением 48/0x30/'0' к результату:

++++[>++++[>+++<-]<-] writing 48/0x30/'0' in cell(2) 
    ,>,>     reading two numbers in cell(0) and cell(1) 
    [<-<->>-]    decrementing cell(0) and cell(1) by 48/0x30/'0' 
    <<      go to cell(0) 
    [      mulitplication loop 
     >     go to cell(1) 
     [>+>+<<-]   move cell(1) to cell(2) and cell(3) 
     >>     go to cell(3) 
     [<<+>>-]   move cell(3) back to cell(1) 
     <<<-    decrement cell(0) 
    ] 
    >[-]<     set cell(1) to 0 so that it can be used as counter 
    ++++[>++++[>+++<-]<-] adding 48/0x30/'0' to cell(2) 
    >>.      print result 

к сведению, что она по-прежнему работает только правильно с результатами меньше 10

0

А действительно большой ресурс является the Esolangs page on Brainfuck algorithms. Там, умножение определяется как:

temp0[-] 
temp1[-] 
x[temp1+x-] 
temp1[ 
y[x+temp0+y-]temp0[y+temp0-] 
temp1-] 

Итак, если лента выглядела как правило, как temp0 temp1 x y, с указателем на temp0, то в результате подстановки будет:

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

Однако возникает ваша главная проблема при вызове . для вывода. Ваш метод работает только при выводе однозначных цифр. Для вывода содержимого ячейки в качестве номера, вы можете использовать следующий код:

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

(The original post containing this algorithm.)