Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能解释一下脑力操吗?_C++_Brainfuck - Fatal编程技术网

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)