我尝试编写一个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
但是我想在这里展示它更具可读性。
答案 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
,那么结果替换将是:
[-]
>[-]
>[<+>-]
<[
>>[<+<<+>>>-]<<<[>>>+<<<-]
>-]
但是,在调用.
输出时会出现主要问题。您的方法仅在输出单个数字时有效。要将单元格的内容输出为数字,可以使用以下代码:
>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]