C++ 有人能解释一下脑力操吗?
我正试图写一个脑力操翻译,但我错过了一些背景或东西。为处理“C++ 有人能解释一下脑力操吗?,c++,brainfuck,C++,Brainfuck,我正试图写一个脑力操翻译,但我错过了一些背景或东西。为处理“+>”等的转换而调用的函数应该是: std::vector<int> Interpreter::interpret(const std::string &src_, const std::vector<int> & input_) 2要求 2.1测试程序 我将使用该程序批量测试和评分您的代码。所以请仔细检查你的函数签名。未能运行 这可能会影响你的项目等级。输入功能将显示所有 让名字解释。
+>
”等的转换而调用的函数应该是:
std::vector<int> Interpreter::interpret(const std::string &src_,
const std::vector<int> & input_)
2要求
2.1测试程序我将使用该程序批量测试和评分您的代码。所以请仔细检查你的函数签名。未能运行 这可能会影响你的项目等级。输入功能将显示所有 让名字
解释。您可以实现尽可能多的其他帮助程序
功能如你所愿。以下各节详细介绍了
规格
2.1.C++,我将使用C++ 11(<代码> G++-STD= C++ 11…<代码> >来测试程序。所以,请随意使用一些添加到C++中的新玩意儿,例如
lambda函数、数组初始化等。为方便起见,请
在
bf.h
和bf.cpp
中分离您的声明和实现代码。
函数签名是std::vector exploration(const std::string
&src,const std::vector&input={})代码>
我的测试程序看起来像
int main()
{
std::vector<int> res;
// output: 1
res = interpret("+.");
for (auto i : res)
std::cout << i << " ";
// output: 2
res = interpret(",.", {2});
for (auto i : res)
std::cout << i << " ";
return 0;
}
intmain()
{
std::向量res;
//产出:1
res=解释(“+”);
用于(自动i:res)
标准::cout
如果给函数一个要转换的数组,那么30000字节数组的意义是什么
想象一下,你得到两个数字——2和5——并希望你的Brainfuck程序打印它们的总和
当你所能做的只是操纵当前单元格中的值并“选择”哪个单元格是当前单元格时,你该怎么做?当然,你在某个时候需要一些临时内存
为了在两个单独的单元格中有两个值,为加法做准备,您可以这样做:
,>,
如果用户输入2
和3
(十进制,非ascii),则程序内存或磁带的前两个字节将如下所示:
[2, 3, 0, 0, ...]
// ^ This is where our tape pointer is now. We incremented it with `>`
够好了,现在添加怎么样?一个解决方案是使用Brainfuck循环
让我们添加两个自然整数,除了递增和递减值外,什么都不做:
int a = 2, b = 3
while (a != 0)
{
b += 1
a -= 1
}
基本上,我们递减第一个值直到它达到零,当这个值递减时,我们递增第二个值。随着时间的推移,这将显示:
a = 2, b = 3
a = 1, b = 4
a = 0, b = 5
a == 0, break
因此,我们确实得到了2+3=5
。这非常简单,可以在brainfuck中实现
, Get value for first cell (a)
>, Get value for second cell (b)
< Move back to a
[ Loop until a == 0
>+ Decrement b
<- Increment a
We are still at a at this point, so everything is alright
] Loop again if a != 0
>. Print the final result (sum of a plus b)
,获取第一个单元格的值(a)
>,获取第二个单元格(b)的值
<
[循环直到a==0
>+减量b
.打印最终结果(a加b之和)
…所有这些都是为了演示如何使用Brainfuck的磁带内存进行实际操作
我相信很多Brainfuck程序将磁带作为一个堆栈进行操作。有趣的是,你实际上并不需要了解Brainfuck程序使用的以可用方式临时存储值的技术
让我们看看Brainfuck解释器如何大致处理上述程序,一条指令接一条指令
*
在堆栈中的值之后表示堆栈指针现在指向该值
我将对其中一些人进行分组,以避免时间过长
,
-磁带[index]=input()
,堆栈现在是[2*,0,0,…]
-索引+=1
,堆栈现在是[2,0*,0,…]
,
-磁带[index]=input()
,堆栈现在是[2,3*,0,…]
-索引+=1
,堆栈现在是[0,5*,0,…]
-打印(磁带[索引])
,打印5
不用说,我不知道这个问题是从2015年开始的!(耶!)至少将来有人会发现这很有用…:^)你写了哪些部分,以及你对哪些部分感到困惑,现在还不清楚。我不知道你为什么在运行exploration
之后选择返回一个新的向量。这个向量肯定代表内存(应该是char
值,而不是int
)对它的任何更改都会修改原始内容。您需要向我们显示实际输出和预期输出。也许您的会解释函数。@paddy按照我对它的理解应该是普通英文字符的方式来输出。因此,在goes中,++++++++++++++++++>++++++>++>++>++>++>+>+>-.++++++++++..++>++>++>++>++++,然后出现“Hello world”向我们展示您的explorate()的主体
。到目前为止你写了什么吗?@paddy:我认为向量
参数是可用的输入,所以当,
需要读取一个值时,它来自该向量。类似地,返回的向量
是
操作的输出。因此测试程序在返回的向量上循环到print值。30000字节的数组是BF程序的内存;src
字符串是将作用于内存的BF程序代码;input
向量是输入值的供应;返回向量是输出值的集合。从规范中我不清楚如果增加当前位置会发生什么n超过内存中的最后一个字节,或在第一个字节之前递减,或在
[2, 3, 0, 0, ...]
// ^ This is where our tape pointer is now. We incremented it with `>`
int a = 2, b = 3
while (a != 0)
{
b += 1
a -= 1
}
a = 2, b = 3
a = 1, b = 4
a = 0, b = 5
a == 0, break
, Get value for first cell (a)
>, Get value for second cell (b)
< Move back to a
[ Loop until a == 0
>+ Decrement b
<- Increment a
We are still at a at this point, so everything is alright
] Loop again if a != 0
>. Print the final result (sum of a plus b)