最近我遇到了一个关于深奥的编程语言的问题。有那种语言的工具。
> - increases the data pointer (so it points to the next cell in the array);
< - decreases the data pointer;
+ - increments the value in the current memory cell (i.e. one pointed by data pointer);
- - decrements the value in the current memory cell;
. - takes the value of current memory cell, converts it to character and prints to output;
, - takes one character from input and puts its ASCII code to the current memory cell.
[ - peeks at current cell, if the value here is non-zero, then simply proceeds to the next instruction, but if the value is 0, then searches forward for corresponding ] and sets code pointer immediately after this (i.e. skips the block within brackets);
] - moves code pointer back, to corresponding [.
: - takes the value of current memory cell and prints to output as a decimal integer;
; - takes next decimal integer (probably, consisting of several digits) from input and puts it to the current cell.
所以我必须用这种语言编写一个程序输入两个数字a和b并将它们放在cell0和cell1中,然后输出这两个数字的和。还有一个额外的要求(我遇到了麻烦),在这个过程之后,应该有3个单元格,单元格0保存a,单元格1保存b,单元格2保存a+b。
这是我的分析:我认为找到将总和放入单元格3并打印它的方法很容易,只需执行;>;<[->>+]>[->+]>:
。然而,在这样的过程之后,cell0和cell1都将保持0,而不是a和b。所以我试图找到一种方法来使用上面的工具来实现这一点,我意识到给定的工具,它就像一个电池,我只能将能量从一个电池转移到另一个电池,但我永远无法将能量从一个电池复制到另一个电池。如果是这样,当我试图保存cell0和cell1时,我永远无法得到总和。
感谢@user3386109在我的问题下的评论。我注意到有很多方法可以欺骗"能量平衡"。我们可以在循环中增加2个或更多的单元格。所以我用了5个单元格,把第一单元格和第二单元格中的a和b转移到第四和第五单元格,同时做求和运算。所以我的算法是这样的:
;>; input two numbers a and b
<[->>+>+] if the first cell is not zero then we keep decrementing it and incrementing the number in 3rd cell and 4th cell until it's zero.
>[->+>>+] if the second cell is not zero then we keep decrementing it and incrementing the number in 3rd cell and 5th cell until it's zero.
then we transfer back value a and b from 4th and 5th cell to 1st and 2nd cell
>>[-<<<+]>[-<<<+]
<<: go back 3rd cell and print out.
最后我的代码是:
;>;<[->>+>+]>[->+>>+]>>[-<<<+]>[-<<<+]<<:
但它是不对的,我检查了几次,找不到错误。有人能帮我吗?谢谢! !
你正在使用的语言本质上是Brainfuck(加上;
和:
操作符,为了方便,但它们并不真正影响语言的工作方式)。
正如user3386109在评论中指出的那样,诀窍是复制输入,同时将其添加到结果中。您的解决方案几乎是正确的,但您似乎忘记了在每个循环内移动内存指针。您的循环只是在每次迭代中向右移动。除非你在做一些有趣的事情,你打算在一个循环中沿着磁带移动,否则你通常会希望<
和>
在每个循环中保持平衡。
这里有一个可能的解决方案:
; Read a into cell 0
[->+>>+<<<] Add a to cells 1 and 3
; Read b into cell 0
[->>+>+<<<] Add b to cells 2 and 3
>>>: Print cell 3 (with cells 1 and 2 holding copies of a and b)
你可以在这里测试一下。这是一个标准的Brainfuck解释器,所以它不支持;
和:
,但如果我们添加字符!
(33)和A
(65),我们得到b
(98)。
关于如何在Brainfuck中解决问题的更多信息,我推荐我在顶部链接的esolangs文章,以及您可以在底部找到的许多链接。