BF Calculator CodeForces - 784G

27 篇文章 0 订阅
2 篇文章 0 订阅

Description
In this problem you will write a simple generator of Brainfuck (
https://en.wikipedia.org/wiki/Brainfuck) calculators.

You are given an arithmetic expression consisting of integers from 0 to 255 and addition/subtraction signs between them. Output a Brainfuck program which, when executed, will print the result of evaluating this expression.

We use a fairly standard Brainfuck interpreter for checking the programs:

30000 memory cells.
memory cells store integers from 0 to 255 with unsigned 8-bit wraparound.
console input (, command) is not supported, but it’s not needed for this problem.

Input
The only line of input data contains the arithmetic expression. The expression will contain between 2 and 10 operands, separated with arithmetic signs plus and/or minus. Each operand will be an integer between 0 and 255, inclusive. The calculations result is guaranteed to be an integer between 0 and 255, inclusive (results of intermediary calculations might be outside of these boundaries).

Output
Output a Brainfuck program which, when executed, will print the result of evaluating this expression. The program must be at most 5000000 characters long (including the non-command characters), and its execution must be complete in at most 50000000 steps.

Input
2+3

Output
++>
+++>
<[<+>-]<
++++++++++++++++++++++++++++++++++++++++++++++++.

Input
9-7

Output
+++++++++>
+++++++>
<[<->-]<
++++++++++++++++++++++++++++++++++++++++++++++++.

Note
You can download the source code of the Brainfuck interpreter by the link http://assets.codeforces.com/rounds/784/bf.cpp. We use this code to interpret outputs.

大意:普通的计算转BF代码
用PY可以很简单 我当时用的C++ 算是水题

#include <iostream>
#include <fstream>
#include <functional>
#include <cstdio>
#include <sstream>
#include <set>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>

using namespace std;
typedef long long ll;
typedef set<int> Set;
typedef vector<int> Vec;
typedef set<int>::iterator sIt;
typedef vector<int>::iterator vIt;
#define mem(s,t) (memset(s,t,sizeof(s)))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define mod 1000000007
#define fast ios_base::sync_with_stdio(false)

int main(){
#ifdef LOCAL
    //freopen("in.txt","r",stdin);
    freopen("o.txt","w",stdout);
#endif
    int sum=0;
    string s;
    cin>>s;
    int j=-1;
    if(isdigit(s[j+1]) && isdigit(s[j+2]) && isdigit(s[j+3])){
        sum+=((s[j+1]-'0')*100+(s[j+2]-'0')*10+s[j+3]-'0');
        j+=3;
    }else if(isdigit(s[j+1]) && isdigit(s[j+2])){
        sum+=((s[j+1]-'0')*10+(s[j+2]-'0'));
        j+=2;
    }else{
        sum+=s[j+1]-'0';
        j++;
    }
    //cout<<sum<<endl;
    for(int i=j;i<s.size();i++){
        if(s[i]=='+'){
            if(isdigit(s[i+1]) && isdigit(s[i+2]) && isdigit(s[i+3])){
                sum+=((s[i+1]-'0')*100+(s[i+2]-'0')*10+s[i+3]-'0');
                i+=3;
            }else if(isdigit(s[i+1]) && isdigit(s[i+2])){
                sum+=((s[i+1]-'0')*10+(s[i+2]-'0'));
                i+=2;
            }else{
                sum+=s[i+1]-'0';
                i++;
            }
        }else if(s[i]=='-'){
            if(isdigit(s[i+1]) && isdigit(s[i+2]) && isdigit(s[i+3])){
                sum-=((s[i+1]-'0')*100+(s[i+2]-'0')*10+s[i+3]-'0');
                i+=3;
            }else if(isdigit(s[i+1]) && isdigit(s[i+2])){
                sum-=((s[i+1]-'0')*10+(s[i+2]-'0'));
                i+=2;
            }else{
                sum-=s[i+1]-'0';
                i++;
            }
        }
    }
    //cout<<sum<<endl;
    int flag1=0;
    if(sum/100>0){
        for(int i=0;i<sum/100;i++){
            cout<<'+';
        }
        cout<<"++++++++++++++++++++++++++++++++++++++++++++++++.>"<<endl;
        flag1=1;
    }
    if(sum/10||flag1){
        for(int i=0;i<(sum/10)%10;i++){
            cout<<'+';
        }
        cout<<"++++++++++++++++++++++++++++++++++++++++++++++++.>"<<endl;
    }
    for(int i=0;i<sum%10;i++){
        cout<<'+';
    }
    cout<<"++++++++++++++++++++++++++++++++++++++++++++++++.>"<<endl;

    return 0;
}

PY版:

def output(n)
    print '+'*(n+48)+'.>'
x=eval(raw_input())
if x/100>0
    output(x/100)
if(x/10>0)
    output(x%100/10)
output(x%10)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值