Brainf * ck中的乘法

时间:2016-12-07 08:18:00

标签: brainfuck

我尝试编写一个brainfuck程序,要求用户输入两个数字(小于10)来计算这些数字的乘积。计算后,应打印结果。我的代码如下所示:

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

但是我想在这里展示它更具可读性。

2 个答案:

答案 0 :(得分:0)

经过一番考虑后,我意识到当我将结果修改为可打印的数字时,我犯了很大的错误。我使用cell(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的结果下正常工作

答案 1 :(得分: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.